2010-03-02 19 views

Odpowiedz

34

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 
+0

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

11
var types = Assembly 
    .GetExecutingAssembly() 
    .GetTypes() 
    .Where(t => typeof(SomeBaseType).IsAssignableFrom(t) && 
       t != typeof(SomeBaseType)) 
    .ToArray(); 
28
var derivedTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
        where t.IsSubclassOf(typeof(A)) 
        select t; 
+0

to warto wspomnieć, to kwerenda pobiera tylko interfejsy lub klas, które bezpośrednio wynikają z rodzaju 'A'. – ZenLulz

+0

@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

3

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(); 
+1

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

+0

@HappyNomad Doskonały punkt. W moim przypadku chciałem obsługiwać interfejsy. –

+0

Moja [odpowiedź] (http://stackoverflow.com/a/40238277) dla duplikatu pytania obsługuje interfejsy. – HappyNomad

Powiązane problemy