Используя отражение, можно ли обнаружить все типы, которые происходят от данного типа?Обнаружение производных типов с использованием отражения
Предположительно, область действия ограничена внутри одной сборки.
Используя отражение, можно ли обнаружить все типы, которые происходят от данного типа?Обнаружение производных типов с использованием отражения
Предположительно, область действия ограничена внутри одной сборки.
в значительной степени так же, как Дарин, но здесь вы идете ..
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 types = Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(SomeBaseType).IsAssignableFrom(t) &&
t != typeof(SomeBaseType))
.ToArray();
var derivedTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsSubclassOf(typeof(A))
select t;
Это стоит отметить, этот запрос извлекает только интерфейсы или классы, которые непосредственно вытекают из типа 'Ā'. – ZenLulz
@ ZenLulz Недопустимое значение параметра ['IsSubclassOf'] (https://msdn.microsoft.com/en-us/library/system.type.issubclassof.aspx). Фактически, он возвращает 'true' для * производных классов *. – HappyNomad
я переписал @ отличный ответ Имеющий в качестве метода расширения:
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();
Зачем использовать ['IsAssignableFrom'] (https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx) вместо [' IsSubclassOf'] (https://msdn.microsoft.com /en-us/library/system.type.issubclassof.aspx)? Может быть, вы хотите поддерживать интерфейсы? Но этот результат будет включать в себя реализацию классов. – HappyNomad
@HappyNomad Вы делаете отличную оценку. В моем случае я хотел поддерживать интерфейсы. –
Мой [ответ] (http://stackoverflow.com/a/40238277) для дублирующего вопроса поддерживает интерфейсы. – HappyNomad
Я предполагаю, что вы используете 'IsAssignableFrom' вместо' IsSubclassOf' для учета интерфейсов. Но вызов этого интерфейса также возвращает его реализующие классы. – HappyNomad