在我的 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/