在我的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
}
答案 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
(评论中还有一些额外的链接)