2010-03-02 29 views

Respuesta

34

más o menos lo mismo que Darin, pero aquí va ..

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

    } 

utilizado como:

var output = FindAllDerivedTypes<System.IO.Stream>(); 
      foreach (var type in output) 
      { 
       Console.WriteLine(type.Name); 
      } 

salidas:

NullStream 
SyncStream 
__ConsoleStream 
BufferedStream 
FileStream 
MemoryStream 
UnmanagedMemoryStream 
PinnedBufferMemoryStream 
UnmanagedMemoryStreamWrapper 
IsolatedStorageFileStream 
CryptoStream 
TailStream 
+0

Supongo que está utilizando 'IsAssignableFrom' en lugar de' IsSubclassOf' para tener en cuenta las interfaces. Pero invocarlo en una interfaz también devuelve sus clases de implementación. – 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

Esto vale la pena mencionar esta consulta sólo recupera interfaces o clases que se derivan directamente del tipo 'A'. – ZenLulz

+0

@ZenLulz El nombre ['IsSubclassOf' method] (https://msdn.microsoft.com/en-us/library/system.type.issubclassof.aspx) name es engañoso. En realidad, devuelve 'true' para * clases derivadas *. – HappyNomad

3

Reescribí @ excelente respuesta de Hath como un método de extensión:

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(); 
    } 
} 

Uso:

var listOfDerived = typeof(MyClass).GetAllDerivedTypes(); 
+1

Por qué usar ['IsAssignableFrom'] (https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx) en lugar de [' IsSubclassOf'] (https://msdn.microsoft.com /en-us/library/system.type.issubclassof.aspx)? ¿Tal vez quieres soportar interfaces? Pero ese resultado incluirá implementar clases. – HappyNomad

+0

@HappyNomad Usted hace un excelente punto. En mi caso, quería dar soporte a las interfaces. –

+0

Mi [respuesta] (http://stackoverflow.com/a/40238277) para una pregunta duplicada admite interfaces. – HappyNomad

Cuestiones relacionadas