C #: elenca tutte le classi in Assembly


103

Vorrei produrre (a livello di codice - C #) un elenco di tutte le classi nel mio assembly.

Eventuali suggerimenti o codice di esempio su come eseguire questa operazione? Riflessione?


Se la tua intenzione è esaminare un assembly a cui non fa riferimento il tuo progetto, vedi la mia risposta aggiornata.
Thorarin

Risposte:


152

Usa Assembly.GetTypes. Per esempio:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
Qualche suggerimento per grandi assemblee? Quando eseguo questo codice per un assembly da 13,8 MB, la mia istanza VS si blocca per un tempo indefinito. Ho provato un piccolo assembly da 9 KB e ha funzionato perfettamente. So cosa stai pensando - perché hai un assembly da 13,8 MB - fa parte del mio livello dati generato utilizzando un modello NetTeirs. Abbiamo molti tavoli.
dyslexicanaboko

1
@dyslexicanaboko: Beh, se hai molti tipi, ci vorrà molto tempo per enumerarli tutti. Quanti tipi ci sono nel tuo assieme però? E cosa ci fai con loro? (Sei sicuro che il problema sia nell'estrarre i tipi o semplicemente cosa stai facendo dopo?)
Jon Skeet

Non riesco a superare la chiamata asm.GetTypes (), si blocca semplicemente - Voglio dire che è ovviamente il fatto che ci sono molti tipi - Non posso fare nulla perché è difficile cercare di ottenerli tutti . La mia CPU raggiunge il 30% su uno dei miei 4 core. Voglio dire, in realtà mi sto solo chiedendo se c'è un modo per dire "Hey - guarda solo in QUESTO spazio dei nomi" - Ho l'impressione che non sia possibile perché il metodo GetTypes () ha solo un costruttore vuoto. Sto cercando di creare una sorta di browser di oggetti.
dyslexicanaboko

1
Buon punto, non l'ho ancora provato. Il mio lavoro per ora è semplicemente indirizzare le classi direttamente usando asm.GetType (fullyQualifiedClassName) - funziona, ma mostrare un elenco di classi all'utente non è possibile, che è quello che volevo. Questo non è rivolto verso il cliente, lo sto usando internamente per me e per altri sviluppatori.
dyslexicanaboko

1
@DebugErr: Sì, è abbastanza facile renderlo solo lezioni se lo desideri, ma la mia ipotesi è che l'OP probabilmente volesse davvero tutti i tipi.
Jon Skeet

102

Vorrei solo aggiungere all'esempio di Jon. Per ottenere un riferimento al proprio assembly, è possibile utilizzare:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection namespace.

Se si desidera esaminare un assembly a cui non si ha alcun riferimento, è possibile utilizzare uno di questi:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

Se intendi creare un'istanza del tuo tipo dopo averlo trovato:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

Vedere la documentazione della classe Assembly per ulteriori informazioni.

Una volta che hai il riferimento Assemblyall'oggetto, puoi usare assembly.GetTypes()come Jon ha già dimostrato.


Come posso fare riferimento a un assembly completamente diverso che si trova nella mia soluzione?
Alex

13
Il modo più semplice è usarlo typeofcon un tipo che conosci si trova in quell'assembly e quindi con la Assemblyproprietà, come nel mio esempio.
Jon Skeet

2
Se vuoi fare riferimento a un assembly, ad esempio abc.dll, che è nella tua soluzione e se stai bene codificando il nome della dll, un altro approccio per fare riferimento all'assembly è: `Assembly assembly = Assembly.Load (" abc ");`
Kash

Carica solo l'assieme corrente. Ho un'applicazione o un exe che utilizza 4 dll o progetti. Come posso ottenere i nomi delle classi di quelle DLL?
Er Mayank

@ JonSkeet Come sarebbe realizzabile in un ambiente c # "moderno"? Ad esempio quando si esegue lo sviluppo UWP. UWP non dispone del metodo GetExecutingAssembly ().
Daniel Armstrong,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.