gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:23:12 25 4
gpt4 key购买 nike

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

我已经了解了这个方法:

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

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

我不确定如何将 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
}

最佳答案

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com