C# 反射:如何创建程序集的精确筛选列表';什么类型?

C# 反射:如何创建程序集的精确筛选列表';什么类型?,c#,reflection,types,C#,Reflection,Types,是否可以对其进行修改,以便列表将包含从“Item”派生的所有类,即使它们被删除了两次或更多次?(即:x.BaseType.BaseType==类型(项目)等) 另外,是否可以过滤掉所有抽象类?您可以使用以下方法 foreach (var item in Assembly.GetExecutingAssembly().GetTypes() .Where(x => x.BaseType == typeof(Item))) { c

是否可以对其进行修改,以便列表将包含从“Item”派生的所有类,即使它们被删除了两次或更多次?(即:x.BaseType.BaseType==类型(项目)等)


另外,是否可以过滤掉所有抽象类?

您可以使用以下方法

foreach (var item in Assembly.GetExecutingAssembly().GetTypes()
                             .Where(x => x.BaseType == typeof(Item)))
{
    comboBox1.Items.Add(item);
}
comboBox1.DisplayMember = "Name";
公共静态类程序{
静态void Main(字符串[]参数){
var items=Assembly.getExecutionGassembly().GetTypes()
其中(x=>!x.isastract&&x.GetBaseTypes().Contains(typeof(Item)));
}
公共静态IEnumerable GetBaseTypes(此类型){
if(type.BaseType==null)返回type.GetInterfaces();
返回可枚举。重复(type.BaseType,1)
.Concat(类型.GetInterfaces())
.Concat(type.GetInterfaces().SelectMany(GetBaseTypes))
.Concat(type.BaseType.GetBaseTypes());
}
}
公共类项{}
公共类ItemA:Item{}
公共类ItemB:ItemA{}
公共抽象类ItemC:Item{}
检索基类型的扩展方法取自

之所以这样做,是因为
Type
只有
BaseType()
,我们需要递归地迭代这些类,以确保获得链中其他类的类型


该程序生成
ItemA
ItemB

一种简单的方法是使用

假设我的“句柄”每个项目都是一个
控制台。WriteLine(项目)
,我有这样的类结构:

foreach (var item in Assembly.GetExecutingAssembly().GetTypes()
                             .Where(x => typeof(Item).IsAssignableFrom(x) && !x.IsAbstract))
{
    //Handle each item
}
产出将是:

项目

上级

最后一项

注意,在这种情况下,
IsAssignableFrom
本身返回true,您可以通过将
&&x!=typeof(Item)
添加到
Where
子句中轻松忽略它

foreach (var item in Assembly.GetExecutingAssembly().GetTypes()
                             .Where(x => typeof(Item).IsAssignableFrom(x) && !x.IsAbstract))
{
    //Handle each item
}
class ItemBase {}
class Item : ItemBase {}
class SuperItem : Item {}
abstract class SuperSuperItem : SuperItem{}
class UltimateItem : SuperSuperItem {}