2009-08-17 16 views

Respuesta

7

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 ...)

+0

Recibí Skeeted, como de costumbre. También podría ser un método de extensión. –

+0

@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. –

+0

@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. –

3
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; 
} 
Cuestiones relacionadas