如何迭代通用反射方法?

时间:2009-12-17 11:02:19

标签: c# generics reflection

在我的CMS中,我有一大堆模块,可以让我做一些聪明的项目列表。我试图通过反射使用它们来提取他们的子对象列表,但我对所涉及的泛型水平感到困惑。

我已经达到了这个方法:

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

返回List。每个模块特定对象都绑定了一个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
}

2 个答案:

答案 0 :(得分: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)
{
}

无需投射,避免使用新关键字而无需使用反射。

答案 1 :(得分:1)

也许这会有所帮助:

http://devlicio.us/blogs/louhaskett/archive/2007/06/13/how-to-cast-between-list-t-s.aspx

(评论中还有一些额外的链接)