¿Cómo puedo obtener todas las clases dentro de un espacio de nombres?

Respuestas:

142

Deberá hacerlo "al revés"; enumere todos los tipos en un ensamblado y luego verifique el espacio de nombres de cada tipo:

using System.Reflection;
private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return 
      assembly.GetTypes()
              .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
              .ToArray();
}

Ejemplo de uso:

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyNamespace");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

Para cualquier cosa anterior a .Net 2.0 donde Assembly.GetExecutingAssembly()no esté disponible, necesitará una pequeña solución para obtener el ensamblaje:

Assembly myAssembly = typeof(<Namespace>.<someClass>).GetTypeInfo().Assembly;
Type[] typelist = GetTypesInNamespace(myAssembly, "<Namespace>");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}
Fredrik Mörk
fuente
2
.Where (t => String.Equals (t.Namespace, nameSpace, StringComparison.Ordinal)
abatishchev
8
Además, tenga en cuenta que Assembly! = Espacio de nombres: algunos espacios de nombres se distribuyen en varios ensamblados.
Bevan
1
y ¿por qué no devolver solo un IEnumerable <Type>? Aún más, haces una enumeración entre los resultados, también creo que 'foreach' en lugar de 'for' es mejor.
abatishchev
2
Buenos comentarios, gracias por eso. Al convertir el tipo de retorno en un IEnumerable <Type>, se elimina la necesidad de la última llamada a ToArray. Sin embargo, no estoy seguro de estar de acuerdo en que 'foreach' es mejor que 'for'; como yo lo veo, la diferencia de rendimiento es despreciable, así que creo que se reduce al estilo personal. Pero puede tener un buen argumento para preferir 'foreach'; si es así, siéntete libre de compartirlo; Me gusta que me demuestren que estoy equivocado :)
Fredrik Mörk
3
Creo que foreach es más fácil de ver personalmente. Detrás de escena, los dos bucles son prácticamente iguales en lo que respecta al rendimiento.
Chev
5

Deberá proporcionar un poco más de información ...

¿Quieres decir usando Reflection. Puede iterar a través de un manifiesto de ensamblados y obtener una lista de tipos usando

   System.Reflection.Assembly myAssembly = Assembly.LoadFile("");

   myAssembly.ManifestModule.FindTypes()

Si solo está en Visual Studio, puede obtener la lista en la ventana de intellisense o abriendo el Explorador de objetos (CTRL + W, J)

Eoin Campbell
fuente
0

Con Reflection, puede recorrer todos los tipos de un ensamblaje. Un tipo tiene una propiedad de espacio de nombres que usa para filtrar solo el espacio de nombres que le interesa.

Gerrie Schenck
fuente