C #: enumerar todas las clases en ensamblado

103

Me gustaría generar (mediante programación - C #) una lista de todas las clases en mi ensamblado.

¿Alguna sugerencia o código de muestra de cómo hacer esto? ¿Reflexión?

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

Respuestas:

152

Utilice Assembly.GetTypes. Por ejemplo:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}
Jon Skeet
fuente
1
¿Alguna sugerencia para grandes montajes? Cuando ejecuto este código para un ensamblado de 13.8 MB, mi instancia de VS se cuelga por lo que parece indefinidamente. Probé un pequeño ensamblaje de 9 KB y funcionó bien. Sé lo que está pensando, por qué tiene un ensamblaje de 13,8 MB, es parte de mi capa de datos generada con una plantilla de NetTeirs. Tenemos muchas mesas.
dyslexicanaboko
1
@dyslexicanaboko: Bueno, si tienes muchos tipos, te llevará mucho tiempo enumerarlos todos. ¿Cuántos tipos hay en su ensamblaje? ¿Y qué haces con ellos? (¿Está seguro de que el problema está en extraer los tipos, o simplemente lo que está haciendo después?)
Jon Skeet
No puedo pasar de la llamada asm.GetTypes (), simplemente se cuelga; quiero decir, obviamente es el hecho de que hay muchos tipos; no puedo hacer nada porque es perforar tratando de obtenerlos todos . Mi CPU dispara al 30% en uno de mis 4 núcleos. Quiero decir, realmente 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 tratando de hacer una especie de navegador de objetos.
dyslexicanaboko
1
Buen punto, todavía no lo he probado. Mi trabajo por ahora es apuntar a las clases directamente usando asm.GetType (fullQualifiedClassName); eso funciona, pero no es posible mostrar una lista de clases al usuario, que es lo que quería. Por cierto, esto no está orientado al cliente, lo estoy usando internamente para mí y para otros desarrolladores.
dyslexicanaboko
1
@DebugErr: Sí, es bastante fácil convertirlo en solo clases si lo desea, pero supongo que el OP probablemente realmente quería todos los tipos.
Jon Skeet
102

Me gustaría agregar algo al ejemplo de Jon. Para obtener una referencia a su propio ensamblado, puede usar:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection espacio de nombres.

Si desea examinar un ensamblado al que no tiene ninguna referencia, puede usar cualquiera de estos:

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

Si tiene la intención de crear una instancia de su tipo una vez que lo haya encontrado:

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

Consulte la documentación de la clase Assembly para obtener más información.

Una vez que tenga la referencia al Assemblyobjeto, puede usarlo assembly.GetTypes()como Jon ya demostró.

Thorarin
fuente
¿Cómo podría hacer referencia a un ensamblaje completamente diferente que está en mi solución?
Alex
13
La forma más fácil es usarlo typeofcon un tipo que sepa que está en ese ensamblado, y luego la Assemblypropiedad, como en mi ejemplo.
Jon Skeet
2
Si desea hacer referencia a un ensamblado, diga abc.dll, que está en su solución y si está bien codificando el nombre de la dll, otro método para hacer referencia al ensamblado es: `Assembly assembly = Assembly.Load (" abc ");`
Kash
Carga solo ensamblaje actual. Tengo una aplicación o exe usando 4 dlls o proyectos. ¿Cómo puedo obtener los nombres de las clases de esos dlls?
Er Mayank
@JonSkeet ¿Cómo se podría lograr esto en un entorno de C # "moderno"? Como cuando se hace el desarrollo de UWP. UWP no tiene el método GetExecutingAssembly ().
Daniel Armstrong