¿Cómo se obtiene una colección de todos los tipos que heredan de un tipo específico?Cómo encontrar todos los tipos en un ensamblado que heredan de un tipo específico C#
Respuesta
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
.
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.
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.
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();
}
- 1. Obtener todos los tipos implementando el tipo genérico abierto específico
- 2. Obtenga todos los tipos derivados de un tipo
- 3. ¿Cómo puedo encontrar todos los DbSets cuyos tipos genéricos derivan de un tipo base dado?
- 4. Compruebe si los objetos tipo heredan un tipo abstracto
- 5. C# Generics - ¿Cómo devuelvo un tipo específico?
- 6. ¿Cómo lograr que todos los usuarios desempeñen un papel específico?
- 7. obtener todos los tipos en ensamblado con el atributo personalizado
- 8. ¿Todos los objetos heredan de NSObject?
- 9. Encontrar todos los espacios de nombres en un ensamblado usando Reflection (DotNET)
- 10. ¿Cómo organizo clases de C# que heredan unas de otras, pero también tienen propiedades que heredan unas de otras?
- 11. Obtener todos los tipos de un ensamblado derivado de una clase base
- 12. La determinación de todos los tipos utilizados por un determinado tipo en C# utilizando la reflexión
- 13. Encontrar un elemento específico en un NSArrayController
- 14. ¿Cómo encontrar (todos) desbordamientos de enteros en un programa C?
- 15. Obtener todos los controles Web de un tipo específico en una página
- 16. ¿Los genéricos Can C# tienen un tipo base específico?
- 17. emacs: abra todos los archivos .txt en un directorio específico en un modo principal específico
- 18. ¿Cómo encontrar un objeto de cierto tipo en un NSArray?
- 19. Técnica para iterar a través de variables y encontrar instancias de un tipo específico
- 20. ¿Cómo selecciono todos los anclajes con un href específico?
- 21. ¿Cómo puedo encontrar todos los archivos en Xcode que NO son un miembro de un objetivo?
- 22. Encontrar todos los grupos administrados por un usuario
- 23. El operador condicional no funciona con dos tipos que heredan el mismo tipo de base
- 24. Obtenga todos los tweets con un hashtag específico
- 25. Python: Operador Sobrecarga de un tipo específico
- 26. XPATH: seleccione todos los nodos secundarios con un atributo específico
- 27. Permitir un atributo personalizado solo en el tipo específico
- 28. ¿Cómo creo un diccionario que contiene diferentes tipos en C#
- 29. XQuery todos los archivos en un directorio específico?
- 30. Obtener tipos en ensamblado (error: System.Reflection.ReflectionTypeLoadException)
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
@Downvoter: ¿me gustaría comentar? –
@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. –