2010-06-21 15 views
6

Assmbly.GetTpes() ottiene i tipi nell'assembly ma se desidero anche la classe nidificata (OrderLine) come faccio? Conosco solo il nome dell'assembly, non i nomi delle classi, quindi GetType (Order + OrderLine) non funzionerà.Assembly.GetTypes() per classi nidificate

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

Solo curioso, hai finito per trovare i tipi nidificati in 'assembly.GetTypes()', oppure sono stati trovati solo chiamando 'type.GetNestedTypes()'? – Greg

risposta

6

non so se assembly.GetTypes() dovrebbe includere classi nidificate. Supponendo che non lo fa, un metodo come il seguente potrebbe iterare su tutti i tipi di assembly.

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

Edit:
MSDN has the following da dire su Assembly.GetTypes

La matrice restituita include tipi nidificati.

Quindi la mia risposta sopra non dovrebbe essere necessaria. Dovresti trovare sia Order che Order+OrderLine restituiti come tipi tramite Assembly.GetTypes.

+0

Questo non raccoglie tipi annidati all'interno di tipi annidati. Ma davvero, chi lo fa? –

+2

@Stefan - Rilevamento di tipi nidificati annidati nidificati è un esercizio di ricorsione lasciato al lettore – Greg

0

È possibile utilizzare un'istruzione LINQ. Non sono sicuro al 100% di ciò che stai cercando di fare, ma puoi fare qualcosa del genere.

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

Modifica

Se il normale Assembly.GetTypes() non restituisce la classe nidificato, si potrebbe iterare l'array e aggiungere tutto ciò che trovate nel alla matrice. come

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

Le classi nidificate non sono necessariamente sottoclassi e le sottoclassi non sono necessariamente nidificate. Questo non fa ciò che vuole il richiedente. – Greg

+0

@Greg Stavo solo dimostrando un esempio di una istruzione LINQ. –

4

Qualcosa di simile a questo:


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

Ooh, SelectMany. * si precipita a MSDN per assorbire le informazioni * –

Problemi correlati