Korzystając z refleksji, czy można odkryć wszystkie typy, które pochodzą z danego typu?Odkrywanie typów pochodnych za pomocą refleksji
Prawdopodobnie zakres byłby ograniczony do jednego zespołu.
Korzystając z refleksji, czy można odkryć wszystkie typy, które pochodzą z danego typu?Odkrywanie typów pochodnych za pomocą refleksji
Prawdopodobnie zakres byłby ograniczony do jednego zespołu.
niemal tak samo jak Darin tych, ale tutaj przejść ..
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();
}
używane jak:
var output = FindAllDerivedTypes<System.IO.Stream>();
foreach (var type in output)
{
Console.WriteLine(type.Name);
}
wyjść:
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;
to warto wspomnieć, to kwerenda pobiera tylko interfejsy lub klas, które bezpośrednio wynikają z rodzaju 'A'. – ZenLulz
@ZenLulz Nazwa ['IsSubclassOf' method] (https://msdn.microsoft.com/en-us/library/system.type.issubclassof.aspx) jest myląca. W rzeczywistości zwraca 'true' dla * klas pochodnych *. – HappyNomad
przepisałem @ doskonałą odpowiedź uczynił jako metodę rozszerzenia:
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();
}
}
Zastosowanie:
var listOfDerived = typeof(MyClass).GetAllDerivedTypes();
Dlaczego używać ['IsAssignableFrom'] (https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx) zamiast [' IsSubclassOf'] (https://msdn.microsoft.com /en-us/library/system.type.issubclassof.aspx)? Może chcesz obsługiwać interfejsy? Ale ten wynik będzie zawierał klasy implementacji. – HappyNomad
@HappyNomad Doskonały punkt. W moim przypadku chciałem obsługiwać interfejsy. –
Moja [odpowiedź] (http://stackoverflow.com/a/40238277) dla duplikatu pytania obsługuje interfejsy. – HappyNomad
Zakładam, że używasz 'IsAssignableFrom' zamiast' IsSubclassOf' do rozliczania interfejsów. Ale wywołanie go na interfejsie zwraca również jego klasy implementacji. – HappyNomad