获取类继承的所有类型和接口并在C#中实现

时间:2015-02-19 13:26:07

标签: c# .net system.reflection

我看到这个与我类似的问题:

How to find all the types in an Assembly that Inherit from a Specific Type C#

但是,如果我的类也实现了多个接口,那该怎么办:

class MyClass: MyBaseClass, IMyInterface1, IMyInterface2

我可以以某种方式获取所有MyClass实现的数组,而不仅仅是逐个进行?

5 个答案:

答案 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});

实例:http://rextester.com/QQVFN51007

答案 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;
}