Angenommen, ich habe eine Assembly (Klassenbibliothek-DLL), die ich mit folgendem Code geladen habe,
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");
und ich brauche den Typ der Versammlung. Um das type zu erhalten, brauche ich den Namespace der Assembly.
Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);
wie kann ich den Namespace in der obigen Zeile erhalten? um den namenraum zu erhalten, muss ich den typ bekommen ..?
Type.Namespace;
ich brauche also den Namespace der Assembly, der verwendet werden kann, um seinen Typ zu erhalten.
Danke im Voraus
Verwenden Sie Assembly.GetTypes (). Dadurch erhalten Sie eine Auflistung aller Typen. Anschließend können Sie die Namespace-Eigenschaft für jeden von ihnen erhalten.
Dann können Sie einfach überprüfen, ob alle Typen denselben Namespace-Wert haben, und diesen Wert verwenden. Fügen Sie andernfalls eine andere Logik hinzu, um festzustellen, welcher Namespace als primär betrachtet werden soll.
Eine Assembly kann mehrere Namespaces enthalten. Ich denke, Sie möchten wirklich fragen, wie Sie einen Typ aus einer Assembly erhalten, ohne den Namespace anzugeben.
Ich weiß nicht, ob es einen besseren Weg gibt, aber Sie können versuchen, nach einem bestimmten Typ zu suchen (add - using linq;):
myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")
Dies wird effektiv ausgelöst, wenn mehr als eine Klasse mit diesem Namen unter verschiedenen Namespaces vorhanden ist (da die Methode Single sicherstellt, dass nur 1 vorhanden ist).
Für eine Liste der Namespaces für diese Klasse haben Sie folgende Möglichkeiten:
Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
Aktualisierte:
WENNderAssembly name
&Assembly namespace
sind gleich in Ihrem Projekt und Sie behalten das Thema unbedingt beiUNDSie wollen den Namespace des aktuell ausgeführte Assembly dann Sie können Folgendes verwenden:
var namespace = Assembly.GetExecutingAssembly().GetName().Name;
Und für Ihre geladene Baugruppe:
var namespace = myAssembly.GetName().Name;
WennWENNder Assembly name
& Assembly namespace
nicht in Ihrem Projekt identisch sind, können Sie diesen Weg verwenden:
// 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();
Mit Mono/Xamarin haben Sie keinen Zugriff auf die Eigenschaft "NameSpace". Sie können stattdessen Folgendes verwenden:
var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
Assembly.GetName().Name
erhält den Standard-Namespace
Hier ist die Lösung, die ich gefunden habe:
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.
}
Ich finde nur alle Typen in der erforderlichen Assembly und suche nach dem, der im Namespace mit dem kürzesten Namen enthalten ist.
Um nur den Namespace zu übernehmen, folgt der folgende Code:
var Assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the Assembly object
var nameSpace = Assembly.GetType().Namespace;//Get the namespace
ODER
public string GetNamespace(object obj)
{
var nameSpace = obj.GetType().Namespace;//Get the namespace
return nameSpace;
}