2009-12-17 49 views
2

在我的CMS中,我有一些模块可以让我做一些巧妙的物品列表。我正在尝试通过反射将它们的子对象列表拉出来,但是我遇到了所涉及的泛型的级别。如何迭代通用反射方法?

我已经得到尽可能这种方法:

var myList = moduleObj.GetType().GetMethod("ChildItems").Invoke(moduleObj, new object[] { }); 

它返回一个列表。每个modulespecificobject被绑定到一个IItemListable接口,该接口中有我正在尝试访问的方法。

我不确定如何将myList对象转换或迭代为一组IItemListable对象来访问所需的方法。

感谢

几个类:

public interface IItemListable 
{ 
    IQueryable GetQueryableList(); 
    string GetIDAsString(); 
    IItemListable GetItemFromUrl(string url, List<IItemListable> additionalItems); 
    bool IsNewItem(); 
    IItemListable CreateItem<T>(ItemListerControl<T> parentList) where T : class, IItemListable; 
    IItemListable LoadItem(string id); 
    IItemListable SaveItem(); 
    RssToolkit.Rss.RssItem ToRssItem(); 
    void DeleteItem(); 
    string ItemUrl(); 
} 

public interface IItemListModule<T> where T: IItemListable 
{ 
    List<T> ChildItems(); 
} 


public class ArticlesModule : ItemListModuleBase<Article>, IItemListModule<Article> 
{ 
    #region IItemListModule<Article> Members 

    public new List<Article> ChildItems() 
    { 
     return base.ChildItems().Cast<Article>().Where(a => a.IsLive).ToList(); 
    } 

    #endregion 
} 

回答

3

你可以在迭代时直接投射:

IList myList = (IList)moduleObj.GetType().GetMethod(
      "ChildItems").Invoke(moduleObj, new object[] { }); 
foreach (IItemListable o in myList) 
{ 

} 

编辑:我会更好地标记ChildItems作为基础虚拟然后你可以写

public override List<Article> ChildItems() 
{ 
    return base.ChildItems().Where(a => a.IsLive).ToList(); 
} 

var myList = moduleObj.ChildItems(); 
foreach (IItemListable o in myList) 
{ 
} 

没有任何需要转换,避免了使用的新关键字,而不必使用反射。

+0

干杯不需要我已经改变它为覆盖,这是从我以前的测试继承 – 2009-12-17 11:44:30