2009-08-12 11 views

Respuesta

127

Algo así como:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
    return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t)); 
} 

Si usted necesita para manejar los genéricos, que se pone un poco más complicado (por ejemplo, pasando el tipo abierto List<> pero esperando para volver a un tipo que deriva de List<int>). Por lo demás es sencillo, aunque :)

Si desea excluir el tipo en sí, puede hacerlo con bastante facilidad:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
    return assembly.GetTypes().Where(t => t != baseType && 
              baseType.IsAssignableFrom(t)); 
} 

Tenga en cuenta que esto también le permitirá especificar una interfaz y encontrar todos los tipos que implementarlo, en lugar de solo trabajar con clases como Type.IsSubclassOf.

+2

Gracias! Terminé usando este Gracias - Terminé usando este Lista public static GetAllSubclassesOf (Tipo tipoBase) {Assembly.GetAssembly (tipoBase) .GetTypes de retorno(). Dónde (tipo => tipo.IsSubclassOf (tipo base)). ToList(); } – aceinthehole

+0

@Downvoter: ¿me gustaría comentar? –

+0

@Downvoter aquí. Mi comentario desapareció Como lo indica aceinthehole, la respuesta es incorrecta. He agregado la respuesta correcta ya que me perdí el comentario de ases hasta que descubrí que el código no funcionaba. Feliz Navidad. –

1

Tienes que enumerar todos los tipos y verificar cada uno si hereda el que estás buscando.

Algunos códigos como el de this question pueden ser útiles para usted.

22

El siguiente método obtendrá una colección de tipos que heredan un tipo.

C#

public IEnumerable<Type> FindSubClassesOf<TBaseType>() 
{ 
    var baseType = typeof(TBaseType); 
    var assembly = baseType.Assembly; 

    return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType)); 
} 

VB.NET

Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type) 

    Dim baseType = GetType(TBaseType) 
    Dim assembly = baseType.Assembly 

    Return From t In assembly.GetTypes() 
      Where t.IsSubClassOf(baseType) 
      Select t 

End Function 

Si necesita incluir tipos que implementan una interfaz véase la respuesta de @ Jon Skeet.

0

considerar el uso de este método (escrito por un PCL):

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
     TypeInfo baseTypeInfo = baseType.GetTypeInfo(); 
     bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface; 

     return 
      from type in assembly.DefinedTypes 
      where isClass ? type.IsSubclassOf(baseType) : 
        isInterface ? type.ImplementedInterfaces.Contains(baseTypeInfo.AsType()) : false 
      select type.AsType(); 
} 
Cuestiones relacionadas