c# - 如何迭代通用反射方法?

标签 c# generics reflection

在我的 CMS 中,我有很多模块,可以让我做一些巧妙的项目列表工作。我试图使用它们通过反射拉出其子对象的列表,但我陷入了所涉及的泛型级别。

我已经掌握了这个方法:

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

返回一个列表。每个模块特定对象都绑定(bind)了一个 IItemListable 接口(interface),其中包含我试图访问的方法。

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

谢谢

一些类(class):

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
}

最佳答案

您可以在迭代时直接转换:

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)
{
}

无需任何强制转换,避免使用 new 关键字并且无需使用反射。

关于c# - 如何迭代通用反射方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1920987/

相关文章:

c# - 自定义 Linq 扩展语法

java - 为什么 Jackson 的 ObjectMapper 方法采用原始 TypeReference

java - Java 中的反射——意外的输出

java - 我们可以使用反射来获取类的静态成员而不在对象实例上调用该方法吗?

c# - 如何测试 MethodInfo.ReturnType 是否为 System.Void 类型?

c# - 如何从 Hyper-V 集群中删除虚拟机?

c# - 播种 ServiceStack 数据库

c# - 我可以使用不相关的类型作为泛型类中的约束吗?

c# - 在 Debug模式下观察变量时出现 FileNotFoundException

c# - Azure.Data.Tables通用基类问题