使用反射发现派生类型

xyz*_*xyz 32 .net c# reflection

使用反射,是否可以发现从给定类型派生的所有类型?

据推测,范围将限于单个组件内.

Hat*_*ath 39

和Darin几乎一样但是你走了..

    public static List<Type> FindAllDerivedTypes<T>()
    {
        return FindAllDerivedTypes<T>(Assembly.GetAssembly(typeof(T)));
    }

    public static List<Type> FindAllDerivedTypes<T>(Assembly assembly)
    {
        var derivedType = typeof(T);
        return assembly
            .GetTypes()
            .Where(t =>
                t != derivedType &&
                derivedType.IsAssignableFrom(t)
                ).ToList();

    } 
Run Code Online (Sandbox Code Playgroud)

用过:

var output = FindAllDerivedTypes<System.IO.Stream>();
            foreach (var type in output)
            {
                Console.WriteLine(type.Name);
            }
Run Code Online (Sandbox Code Playgroud)

输出:

NullStream
SyncStream
__ConsoleStream
BufferedStream
FileStream
MemoryStream
UnmanagedMemoryStream
PinnedBufferMemoryStream
UnmanagedMemoryStreamWrapper
IsolatedStorageFileStream
CryptoStream
TailStream
Run Code Online (Sandbox Code Playgroud)


Ser*_*jev 28

var derivedTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                   where t.IsSubclassOf(typeof(A))
                   select t;
Run Code Online (Sandbox Code Playgroud)

  • @ZenLulz [`IsSubclassOf`方法](https://msdn.microsoft.com/zh-cn/library/system.type.issubclassof.aspx)的名称具有误导性。实际上,它对*派生类*返回`true`。 (2认同)

Dar*_*rov 11

var types = Assembly
    .GetExecutingAssembly()
    .GetTypes()
    .Where(t => typeof(SomeBaseType).IsAssignableFrom(t) && 
                t != typeof(SomeBaseType))
    .ToArray();
Run Code Online (Sandbox Code Playgroud)


Nat*_*ini 6

我重写了 @Hath 的优秀答案作为扩展方法:

public static class TypeExtensions
{
    public static List<Type> GetAllDerivedTypes(this Type type)
    {
        return Assembly.GetAssembly(type).GetAllDerivedTypes(type);
    }

    public static List<Type> GetAllDerivedTypes(this Assembly assembly, Type type)
    {
        return assembly
            .GetTypes()
            .Where(t => t != type && type.IsAssignableFrom(t))
            .ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var listOfDerived = typeof(MyClass).GetAllDerivedTypes();
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用 [`IsAssignableFrom`](https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx) 而不是 [`IsSubclassOf`](https://msdn.microsoft.com/ en-us/library/system.type.issubclassof.aspx)?也许您想支持接口?但该结果将包括实现类。 (3认同)