¿Cómo se obtienen todas las clases en un espacio de nombres a través de la reflexión en C#?Obtener todos los tipos en un espacio de nombres a través de la reflexión
Respuesta
using System.Reflection;
using System.Collections.Generic;
//...
static List<string> GetClasses(string nameSpace)
{
Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespacelist = new List<string>();
List<string> classlist = new List<string>();
foreach (Type type in asm.GetTypes())
{
if (type.Namespace == nameSpace)
namespacelist.Add(type.Name);
}
foreach (string classname in namespacelist)
classlist.Add(classname);
return classlist;
}
Nota: Puede hacerlo siempre que ingrese el conjunto y la NS que debe buscar. Los tipos se pueden definir en ensamblajes múltiples y pertenecen a la misma NS. – Gishu
Eso es cierto Gishu. Supongo que sería mejor pasar el conjunto, así como el espacio de nombres del ensamblado, para eliminar la ambigüedad. –
"namespace" - palabra clave reservada, debe agregar @ prefix para compilar este código – aku
Usted no será capaz de obtener todo tipo en un espacio de nombres, debido a que un espacio de nombres puede conectar varias asambleas, pero se puede llegar a todas las clases en una asamblea y comprobar para ver si pertenecen a ese espacio de nombres.
Assembly.GetTypes()
trabaja en el ensamblaje local, o puede cargar un ensamblaje primero y luego llamar al GetTypes()
.
+1 para la respuesta correcta. 'AppDomain.CurrentDomain.GetAssemblies' puede ser útil. – nawfal
... y luego recorrerlos, filtrando los que no coinciden con el espacio de nombres. –
El siguiente código imprime los nombres de las clases en namespace
especificado en el ensamblaje actual.
Como señalaron otros tipos, un espacio de nombres puede estar disperso entre diferentes módulos, por lo que primero debe obtener una lista de ensamblajes.
string nspace = "...";
var q = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass && t.Namespace == nspace
select t;
q.ToList().ForEach(t => Console.WriteLine(t.Name));
Los espacios de nombres son realmente bastante pasivos en el diseño del tiempo de ejecución y sirven principalmente como herramientas de organización. El nombre completo de un tipo en .NET consiste en Namespace y Class/Enum/Etc. conjunto. Si solo desea pasar por un ensamblaje específico, simplemente recorrerá los tipos devueltos por el ensamblaje. GetExportedTypes() comprobando el valor del tipo. Namespace. Si estuviera tratando de pasar por todos los ensamblados cargados en el actual AppDomain, implicaría el uso de AppDomain.CurrentDomain. GetAssemblies()
Aquí es una solución para los errores LoaderException es muy probable que encontrar si uno de los tipos sublasses un tipo en otro montaje:
// Setup event handler to resolve assemblies
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);
a.GetTypes();
// process types here
// method later in the class:
static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}
Eso debería ayudar con los tipos de carga definidas en otros conjuntos.
Espero que ayude!
Claro que se ve útil, y menos útil y menos confuso que el código de Ryan Farley, incluso sin pensarlo. – ProfK
Aunque también me has confundido por un tiempo. Todavía puedo adivinar que el material 'Assembly a' representa el procesamiento normal que podría provocar el desencadenamiento de este evento. No veo uso para 'a' al ayudar con los errores' LoaderException'. ¿Estoy en lo cierto? – ProfK
//a simple combined code snippet
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MustHaveAttributes
{
class Program
{
static void Main (string[] args)
{
Console.WriteLine (" START ");
// what is in the assembly
Assembly a = Assembly.Load ("MustHaveAttributes");
Type[] types = a.GetTypes();
foreach (Type t in types)
{
Console.WriteLine ("Type is {0}", t);
}
Console.WriteLine (
"{0} types found", types.Length);
#region Linq
//#region Action
//string @namespace = "MustHaveAttributes";
//var q = from t in Assembly.GetExecutingAssembly().GetTypes()
// where t.IsClass && t.Namespace == @namespace
// select t;
//q.ToList().ForEach (t => Console.WriteLine (t.Name));
//#endregion Action
#endregion
Console.ReadLine();
Console.WriteLine (" HIT A KEY TO EXIT ");
Console.WriteLine (" END ");
}
} //eof Program
class ClassOne
{
} //eof class
class ClassTwo
{
} //eof class
[System.AttributeUsage (System.AttributeTargets.Class |
System.AttributeTargets.Struct, AllowMultiple = true)]
public class AttributeClass : System.Attribute
{
public string MustHaveDescription { get; set; }
public string MusHaveVersion { get; set; }
public AttributeClass (string mustHaveDescription, string mustHaveVersion)
{
MustHaveDescription = mustHaveDescription;
MusHaveVersion = mustHaveVersion;
}
} //eof class
} //eof namespace
¿Qué son'AttributeClass' el nombre 'MustHaveAttributes'? No veo nada relacionado con probar si una clase tiene atributos o no. Esto es más confuso que útil. – ProfK
Al igual que la respuesta @aku, pero utilizando métodos de extensión:
string @namespace = "...";
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.Namespace == @namespace)
.ToList();
types.ForEach(t => Console.WriteLine(t.Name));
Como dice flyswat, que pueden tener el mismo espacio de nombres que abarca en varios ensamblados (por ejemplo System.Collections.Generic
). Deberá cargar todos los ensamblajes si aún no están cargados. Entonces para una respuesta completa:
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(t => t.GetTypes())
.Where(t => t.IsClass && t.Namespace == @namespace)
Esto debería funcionar a menos que desee clases de otros dominios. Para obtener una lista de todos los dominios, siga this link.
funciona bien - un pequeño recordatorio: traté de eliminar "' && t.Namespace == @ namespace' "- que por causa me dio ** todos los ** .NET assemblies :-) – Netsi1964
@ Netsi1964 si elimina' && t.Namespace == @ namespace' obtienes todas * clases * de * todos los ensamblados *, incluido .net's. 'GetAssemblies' le dará todos los ensamblados, y' GetAssemblies(). SelectMany (t => t.GetTypes()) 'dará todos los tipos (clases, estructuras, etc.) de todos los ensamblajes. – nawfal
conseguir todas las clases por parte del nombre de espacio de nombres en una sola fila:
var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
Para una Asamblea específica, con un filtro de nombre de la clase:
var asm = Assembly.Load("Some.Assembly.Name");
var nameSpace = "Some.Namespace.Name";
var classes = asm.GetTypes().Where(p =>
p.Namespace == nameSpace &&
p.Name.Contains("ClassNameFilter")
).ToList();
Nota: el proyecto debe hacer referencia al ensamblado
Muy sencillo
Type[] types = Assembly.Load(new AssemblyName("mynamespace.folder")).GetTypes();
foreach (var item in types)
{
}
- 1. Obtener nombres de propiedades a través de la reflexión de un objeto COM
- 2. C# - ¿Obtener nombre fácil de usar de los tipos simples a través de la reflexión?
- 3. ¿Cómo obtener todos los nombres de clase en un espacio de nombres en Ruby?
- 4. ¿Cómo obtener los tipos de parámetros usando la reflexión?
- 5. Obtener tipos en mscorlib 2.0.5.0 (también conocido como Silverlight mscorlib) a través de la reflexión?
- 6. La determinación de todos los tipos utilizados por un determinado tipo en C# utilizando la reflexión
- 7. ¿Cómo obtener los campos en un objeto a través de la reflexión?
- 8. ¿Cómo puedo obtener un tipo de un conjunto referenciado a través de la reflexión
- 9. Obtener valor de enumeración a través de la reflexión
- 10. PHP MySQL Obtener nombres de columna Mientras iteración a través de todos los registros
- 11. C#: Obtener valor a través de la reflexión
- 12. Obtener MethodBase actual a través de la reflexión
- 13. Obtener todos los nombres de tabla configurados en SessionFactory
- 14. Establecer las propiedades de un objeto a través de la reflexión con diferentes propiedades tipos
- 15. Agregar tipos al espacio de nombres estándar
- 16. ¿Es posible agregar un espacio de nombres C++ a todos los símbolos de una biblioteca C?
- 17. ¿Cómo obtener el valor de un argumento de método a través de la reflexión en Java?
- 18. Obtener nombres/tipos de columna devueltos de un procedimiento almacenado
- 19. Cómo obtener nombres de argumento usando la reflexión
- 20. constructores dentro de un espacio de nombres
- 21. Obtener todos los caracteres antes de espacio en MySQL
- 22. obtener los nombres de usuario en un grupo de Active Directory a través de .NET
- 23. ¿Cómo obtener todos los nombres de propiedades en una entidad?
- 24. Uso de C# con OpenOffice a través de la reflexión
- 25. Agregue un espacio de nombres a los elementos
- 26. matlab cómo iterar a través de todos los objetos en un área de trabajo
- 27. mysql, iterar a través de los nombres de columna
- 28. java: obtener todos los nombres de variables en una clase
- 29. plantilla especializada en un espacio de nombres
- 30. Obtener todos los tipos de un ensamblado derivado de una clase base
puede editar su pregunta ... la pregunta del subtexto es más comunicativa que el 'Espacio de nombres en C#' – Gishu
Puede mirar [aquí] (http: // stackoverflow.com/questions/949246/how-to-get-all-classes-within-namespace). Hay 2 muestras diferentes. –