Tengo un ensamblado, y quiero enumerar todas las clases que heredan de una clase/interfaz específica.Enumerar todas las clases que heredan de una clase/interfaz específica
¿Cómo podría hacer esto?
Tengo un ensamblado, y quiero enumerar todas las clases que heredan de una clase/interfaz específica.Enumerar todas las clases que heredan de una clase/interfaz específica
¿Cómo podría hacer esto?
Algo así como:
public static IEnumerable<Type> GetSubtypes(Assembly assembly, Type parent)
{
return assembly.GetTypes()
.Where(type => parent.IsAssignableFrom(type));
}
Eso está bien para el caso simple, pero se vuelve más "interesante" (léase: complicado) cuando se quiere encontrar "todo tipo de aplicación IEnumerable<T>
para cualquier T
", etc.
(Como dice Adam, fácilmente podría hacer que este sea un método de extensión. Depende de si cree que lo volverá a utilizar o no; es una pena que los métodos de extensión tengan que estar en una clase estática no anidada ...)
public static IEnumerable<Type> GetTypesThatInheritFrom<T>(this Assembly asm)
{
var types = from t in asm.GetTypes()
where typeof(T).IsAssignableFrom(t)
select t;
return types;
}
Recibí Skeeted, como de costumbre. También podría ser un método de extensión. –
@Jon, ¿Cómo harías si "quieres buscar" todos los tipos que implementan IEnumerable para cualquier T "etc."? También dijiste "es un dolor que los métodos de extensión tengan que estar en una clase estática no anidada". ¿Por qué? Usas clases anidadas a menudo. Gracias. –
@Joan: Necesito saber si fue encontrar una implementación de * particular * 'IEnumerable' o * any * 'IEnumerable ' (es decir, ¿está T especificado o no?) En cuanto a los métodos de extensión ... I no tienden a escribir muchas clases estáticas de primer nivel. Crear uno solo para métodos de extensión es un poco exagerado. –