Используя отражение, можно ли обнаружить все типы, которые происходят от данного типа?
Предположительно, область действия будет ограничена внутри одной сборки.
Используя отражение, можно ли обнаружить все типы, которые происходят от данного типа?
Предположительно, область действия будет ограничена внутри одной сборки.
в значительной степени то же, что и Дарин, но здесь вы идете.
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();
}
используется как:
var output = FindAllDerivedTypes<System.IO.Stream>();
foreach (var type in output)
{
Console.WriteLine(type.Name);
}
выходы:
NullStream
SyncStream
__ConsoleStream
BufferedStream
FileStream
MemoryStream
UnmanagedMemoryStream
PinnedBufferMemoryStream
UnmanagedMemoryStreamWrapper
IsolatedStorageFileStream
CryptoStream
TailStream
var derivedTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsSubclassOf(typeof(A))
select t;
var types = Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(SomeBaseType).IsAssignableFrom(t) &&
t != typeof(SomeBaseType))
.ToArray();
Я переписал @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();
}
}
Использование:
var listOfDerived = typeof(MyClass).GetAllDerivedTypes();