我看到这个与我类似的问题:
How to find all the types in an Assembly that Inherit from a Specific Type C#
但是,如果我的类也实现了多个接口,那该怎么办:
class MyClass: MyBaseClass, IMyInterface1, IMyInterface2
我可以以某种方式获取所有MyClass
实现的数组,而不仅仅是逐个进行?
答案 0 :(得分:4)
对于接口,您可以拨打Type.GetInterfaces()
答案 1 :(得分:4)
如果您对所有基本类型以及可以使用的接口感兴趣:
static Type[] BaseTypesAndInterfaces(Type type)
{
var lst = new List<Type>(type.GetInterfaces());
while (type.BaseType != null)
{
lst.Add(type.BaseType);
type = type.BaseType;
}
return lst.ToArray();
}
使用它像:
var x = BaseTypesAndInterfaces(typeof(List<MyClass>));
甚至可以将其设为基于通用的
static Type[] BaseTypesAndInterfaces<T>()
{
Type type = typeof(T);
var lst = new List<Type>(type.GetInterfaces());
while (type.BaseType != null)
{
lst.Add(type.BaseType);
type = type.BaseType;
}
return lst.ToArray();
}
和
var x = BaseTypesAndInterfaces<MyClass>();
但它可能不那么有趣(因为通常你在运行时“发现”MyClass
,所以你不能轻易地使用泛型方法)
答案 2 :(得分:3)
如果要将具有基本类型的接口组合到单个阵列中,可以执行以下操作:
var t = typeof(MyClass);
var allYourBase = new[] {t.BaseType}.Concat(t.GetInterfaces()).ToArray();
请注意,您的数组将包含所有基础,包括System.Object
。这不适用于System.Object
,因为其基本类型为null
。
答案 3 :(得分:1)
你可以使用类似的东西一气呵成:
var allInheritance = type.GetInterfaces().Union(new[] { type.BaseType});
答案 4 :(得分:0)
这是我使用的扩展方法:
public static IEnumerable<Type> EnumInheritance(this Type type)
{
while (type.BaseType != null)
yield return type = type.BaseType;
foreach (var i in type.GetInterfaces())
yield return i;
}