2009-08-22 13 views
75

Me gustaría generar (programáticamente - C#) una lista de todas las clases de mi ensamblaje.C#: enumerar todas las clases en el ensamblaje

¿Alguna sugerencia o código de ejemplo de cómo hacerlo? ¿Reflexión?

+0

Si su intención es examinar un conjunto al que no hace referencia su proyecto, consulte mi respuesta actualizada. – Thorarin

Respuesta

115

Use Assembly.GetTypes. Por ejemplo:

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

¿Alguna sugerencia para ensamblajes grandes? Cuando ejecuto este código para un ensamblaje de 13.8 MB, mi instancia de VS se bloquea por lo que parece indefinidamente. Probé un pequeño conjunto de 9 KB y funcionó bien. Sé lo que estás pensando: ¿por qué tienes un ensamblaje de 13.8 MB? Es parte de mi capa de datos generada con una plantilla de NetTeirs. Tenemos muchas tablas – dyslexicanaboko

+1

@dyslexicanaboko: Bueno, si tienes muchos tipos, pasará mucho tiempo para enumerarlos todos. Sin embargo, ¿cuántos tipos * son * en su ensamblaje? ¿Y qué estás haciendo con ellos? (¿Estás seguro de que el problema está en extraer los tipos, o simplemente lo que estás haciendo después?) –

+0

No puedo pasar la llamada a asm.GetTypes(), simplemente se cuelga - Quiero decir que es obviamente el hecho de que hay Hay muchos tipos: no puedo hacer nada porque se está esforzando por tratar de obtenerlos todos. Mi CPU dispara al 30% en uno de mis 4 núcleos. En realidad, me pregunto si hay una manera de decir: "Oye, solo mira en ESTE espacio de nombres". Tengo la impresión de que no es posible porque el método GetTypes() solo tiene un constructor vacío. Estoy intentando hacer una especie de navegador de objetos. – dyslexicanaboko

76

Me gustaría agregar al ejemplo de Jon. Para obtener una referencia a su propio ensamblaje, puede utilizar:

Assembly myAssembly = Assembly.GetExecutingAssembly(); 

System.Reflection espacio de nombres.

Si desea examinar un conjunto que no tiene referencia a, puede utilizar cualquiera de estos:

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

Si va a crear una instancia de su tipo, una vez lo has encontrado:

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

Consulte el Assembly class documentation para obtener más información.

Una vez que tenga la referencia al objeto Assembly, puede usar assembly.GetTypes() como Jon ya demostró.

+0

¿Cómo podría hacer referencia a un ensamblaje completamente diferente que está en mi solución? – Alex

+11

La manera más fácil es usar 'typeof' con un tipo que sabe que está en ese ensamblado, y luego la propiedad' Assembly', como en mi ejemplo. –

+2

Si desea hacer referencia a un ensamblado, digamos abc.dll, que está en la solución y si está bien codificar el nombre dll, otro enfoque para hacer referencia al ensamblado es: 'Assembly assembly = Assembly.Load (" abc "); ' – Kash

Cuestiones relacionadas