multiple - namespace c# que es
¿Cómo obtener el espacio de nombres de una asamblea? (7)
Considere que tengo un ensamblaje (clase biblioteca dll) que he cargado usando el siguiente código,
Assembly a = Assembly.LoadFrom(@"C:/Documents and Settings/E454935/My Documents/Visual Studio 2005/Projects/nunit_dll_hutt/for_hutt_proj/bin/Debug/asdf.dll");
y necesito obtener el tipo de la Asamblea. Para obtener el tipo necesito el espacio de nombres del ensamblaje.
Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);
¿Cómo puedo obtener el espacio de nombres en la línea anterior? como inorder para obtener el espacio de nombres , necesito obtener el tipo ..?
Type.Namespace;
es decir, necesito obtener el espacio de nombres del ensamblaje que se puede usar para obtener su tipo.
Gracias por adelantado
Conseguir que un ensamblaje debe contener casi una clase (o cualquier otro tipo, como una interfaz) y deben estar contenidos en un espacio de nombres, que debe comenzar dentro del espacio de nombres de ensamblados, el más corto de ellos será el último.
Entonces, aquí está la solución que encontré:
public string GetAssemblyNamespace(Assembly asm)
{
string ns = @"";
foreach (Type tp in asm.Modules.First().GetTypes()) //Iterate all types within the specified assembly.
if (ns.Length == 0 ? true : tp.Namespace.Length < ns.Length) //Check whether that''s the shortest so far.
ns = tp.Namespace; //If it''s, set it to the variable.
return ns; //Now it is the namespace of the assembly.
}
Simplemente encuentro todos los tipos dentro del ensamblaje requerido y busco el que está contenido en el espacio de nombres que tiene el nombre más corto.
Al usar Mono / Xamarin, no tiene acceso a la propiedad "NameSpace". Puedes usar lo siguiente en su lugar:
var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split('','')[1].Trim();
Para tomar solo el espacio de nombres sigue el siguiente código:
var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
var nameSpace = assembly.GetType().Namespace;//Get the namespace
O
public string GetNamespace(object obj)
{
var nameSpace = obj.GetType().Namespace;//Get the namespace
return nameSpace;
}
Un ensamblaje puede contener múltiples espacios de nombres. Creo que lo que realmente quiere preguntar es cómo obtener un tipo de un ensamblaje sin especificar el espacio de nombres.
No sé si hay una mejor manera, pero puedes intentar buscar un tipo específico como este (agregar - usando linq;):
myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")
Esto se lanzará de manera efectiva si hay más de 1 clase con ese nombre bajo diferentes espacios de nombres (porque el método Único garantiza que solo haya 1).
Para obtener una lista de los espacios de nombres para esa clase, puede:
Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
Use Assembly.GetTypes (): esto le dará una colección de todos los tipos y luego podrá obtener la propiedad de espacio de nombres para cada uno de ellos.
Entonces supongo que simplemente puede comprobar que todos los tipos tienen el mismo valor de espacio de nombres y usar este valor. De lo contrario, agregue alguna otra lógica para detectar qué espacio de nombres debe considerarse primario.
Assembly.GetName().Name
le dará el espacio de nombres predeterminado
Actualizado:
SI el assembly name
del assembly name
y el assembly namespace
son los mismos en su proyecto y de seguro mantiene el mismo tema Y desea obtener el espacio de nombres del ensamblado ejecutado actual, entonces puede usar esto:
var namespace = Assembly.GetExecutingAssembly().GetName().Name;
Y para su montaje cargado:
var namespace = myAssembly.GetName().Name;
Pero SI el assembly name
del assembly name
y el assembly namespace
no son los mismos en su proyecto, entonces puede usar de esta manera:
// Like @eglasius answer >>
// Find all namespaces in the target assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();