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)
Dar*_*rov 11
var types = Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(SomeBaseType).IsAssignableFrom(t) &&
t != typeof(SomeBaseType))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
我重写了 @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)