¿Cómo se obtienen todas las clases en un espacio de nombres a través de la reflexión en C #?
c#
.net
reflection
namespaces
media pensión
fuente
fuente
Respuestas:
El siguiente código imprime los nombres de las clases especificadas
namespace
en el ensamblaje actual.Como otros muchachos señalaron, un espacio de nombres puede estar disperso entre diferentes módulos, por lo que primero debe obtener una lista de ensamblajes.
fuente
Como dice FlySwat, puede tener el mismo espacio de nombres que abarca varios ensamblajes (por ejemplo, por ejemplo
System.Collections.Generic
). Tendrá que cargar todos esos ensamblajes si aún no están cargados. Entonces, para una respuesta completa:Esto debería funcionar a menos que desee clases de otros dominios. Para obtener una lista de todos los dominios, siga este enlace.
fuente
&& t.Namespace == @namespace
", lo que me dio todos los ensamblados .net :-)&& t.Namespace == @namespace
, obtiene todas las clases de todos los ensamblados , incluidos .net.GetAssemblies
le dará todos los ensamblajes yGetAssemblies().SelectMany(t => t.GetTypes())
todos los tipos (clases, estructuras, etc.) de todos los ensamblajes.Assembly.Load(nameof(NameOfMyNamespace))
trabajado bien.NB: el código anterior ilustra lo que está sucediendo. Si lo implementara, se puede utilizar una versión simplificada:
fuente
classlist
la primera iteración sobre elasm.GetTypes()
resultado.Para un ensamblado específico, NameSpace y ClassName:
Nota: El proyecto debe hacer referencia al ensamblaje.
fuente
Aquí hay una solución para los errores de LoaderException que es probable que encuentre si uno de los tipos subclasifica un tipo en otro ensamblado:
Eso debería ayudar con los tipos de carga definidos en otros ensamblajes.
¡Espero que ayude!
fuente
Assembly a
material representa el procesamiento normal que podría provocar que este evento se active. No veo ninguna utilidad paraa
ayudar con losLoaderException
errores. Estoy en lo cierto?No podrá obtener todos los tipos en un espacio de nombres, porque un espacio de nombres puede unir múltiples ensamblajes, pero puede obtener todas las clases en un ensamblaje y verificar si pertenecen a ese espacio de nombres.
Assembly.GetTypes()
funciona en el ensamblaje local, o puede cargar un ensamblaje primero y luego llamarloGetTypes()
.fuente
AppDomain.CurrentDomain.GetAssemblies
puede ser útilAl igual que @aku answer, pero usando métodos de extensión:
fuente
Obtenga todas las clases por parte del nombre del espacio de nombres en una sola fila:
fuente
Los espacios de nombres son bastante pasivos en el diseño del tiempo de ejecución y sirven principalmente como herramientas organizativas. El nombre completo de un tipo en .NET consiste en el espacio de nombres y Clase / Enum / Etc. conjunto. Si solo desea pasar por un ensamblaje específico, simplemente recorrerá los tipos devueltos por el ensamblaje. GetExportedTypes () comprobando el valor de tipo. Espacio de nombres . Si intentara pasar por todos los ensamblados cargados en el AppDomain actual, implicaría usar AppDomain.CurrentDomain. GetAssemblies ()
fuente
fuente
AttributeClass
el nombreMustHaveAttributes
? No veo nada relacionado con probar si una clase tiene atributos o no. Esto es más confuso que útil.Bastante sencillo
fuente