2010-06-21 15 views
6

Assmbly.GetTpes() obtiene los tipos en el ensamblado, pero si también quiero una clase anidada (OrderLine) ¿cómo hago eso? Solo sé el nombre del ensamblaje, no los nombres de clase, por lo que GetType (Order + OrderLine) no funcionará.Assembly.GetTypes() para clases anidadas

public class Order 
{ 
    public class OrderLine 
    { 
    } 
} 
+0

Simplemente curioso, ¿acabas encontrando los tipos anidados en 'assembly.GetTypes()', o solo se encontraron al invocar 'type.GetNestedTypes()'? – Greg

Respuesta

6

no sé si se supone assembly.GetTypes() para incluir las clases anidadas. Asumiendo que no es así, un método como el siguiente podría iterar sobre todos los tipos de ensamblaje.

IEnumerable<Type> AllTypes(Assembly assembly) 
{ 
    foreach (Type type in assembly.GetTypes()) 
    { 
     yield return type;   
     foreach (Type nestedType in type.GetNestedTypes()) 
     { 
      yield return nestedType; 
     } 
    } 
} 

Editar:
MSDN has the following que decir sobre Assembly.GetTypes

La matriz devuelta incluye tipos anidados.

Así que realmente mi respuesta anterior no debería ser necesaria. Debería encontrar Order y Order+OrderLine devueltos como tipos por Assembly.GetTypes.

+0

Esto no captaría los tipos anidados dentro de los tipos anidados. Pero realmente, ¿quién hace eso? –

+2

@Stefan - La detección de tipos anidados y anidados es un ejercicio de recursión para el lector – Greg

0

Puede usar una declaración LINQ. No estoy 100% seguro de lo que intentas hacer, pero puedes hacer algo como esto.

Assembly.GetTypes().Where(type => type.IsSubclassOf(SomeType) && type.Whatever); 

Editar

Si lo normal Assembly.GetTypes() no va a regresar a su clase anidada, que podría iterar sobre la matriz y añadir todo lo que encuentre en a la matriz. como

var allTypes = new List<Type>(); 
var types = Assembly.GetTypes(); 
allTypes.AddRange(types); 
foreach(var type in types) 
{ 
    allTypes.AddRange(type.GetNestedTypes()); 
} 
+2

Las clases anidadas no son necesariamente subclases, y las subclases no están necesariamente anidadas. Esto no hace lo que quiere el asker. – Greg

+0

@Greg Solo estaba demostrando un ejemplo de una declaración LINQ. –

4

Algo como esto:


Assembly.GetTypes().SelectMany(t => new [] { t }.Concat(t.GetNestedTypes()));
+1

Ooh, SelectMany. * se va corriendo a MSDN para absorber información * –

Cuestiones relacionadas