Dieser Code:
Type.GetType("namespace.a.b.ClassName")
kehrt zurück null
.
und ich habe in den usings:
using namespace.a.b;
Aktualisieren:
Der Typ existiert, er befindet sich in einer anderen Klassenbibliothek und ich muss ihn anhand des Stringnamens abrufen.
c#
reflection
Omu
quelle
quelle
Antworten:
Type.GetType("namespace.qualified.TypeName")
Funktioniert nur, wenn der Typ entweder in mscorlib.dll oder in der aktuell ausgeführten Assembly gefunden wird.Wenn keines dieser Dinge zutrifft, benötigen Sie einen Assembly-qualifizierten Namen :
quelle
Assembly a = Assembly.Load("SomeLibrary");
laden - - und dann den Typ nach Namen aus der Assembly laden -Type t = a.GetType("namespace.a.b.ClassName");
.typeof(SomeTypeInThatAssembly).Assembly.GetTypes().Where((t) => t.FullName == youFullName);
Sie können den Typ auch ohne Assembly-qualifizierten Namen abrufen, aber auch mit dem DLL-Namen, zum Beispiel:
Ich hatte die gleiche Situation und es hat bei mir funktioniert. Ich brauchte ein Objekt vom Typ "DataModel.QueueObject" und hatte einen Verweis auf "DataModel", also bekam ich den Typ wie folgt:
Die zweite Zeichenfolge nach dem Komma ist der Referenzname (DLL-Name).
quelle
NamespaceTypeName, AssemblyNameSpec
woAssemblyNameSpec
die Kennung der Baugruppe ohne Eigenschaften. Auch wenn diese Antwort im Wesentlichen das gleiche ist wie die akzeptierte Ich gehe davon aus, dass einige Leute dieses vorziehen , weil es mit einigen des „Lärm“ beseitigt , dass die Montageeigenschaften einführen (zBVersion
,Culture
PublicKeyToken
). Glücklicherweise sind die Eigenschaften optional .AtlasKernelBusinessModel.AtlasConstants+ClaimCoverage+Status,AtlasKernelBusinessModel
Versuchen Sie es mit dieser Methode
quelle
AppDomain
es nicht unterstützt wird. Ich bin mir keiner Alternativen sicher.quelle
T
generische Typ entfernt ist.Wenn die Assembly Teil des Builds einer ASP.NET-Anwendung ist, können Sie die BuildManager-Klasse verwenden:
quelle
Wenn sich Ihre Klasse nicht in der aktuellen Assambly befindet, müssen Sie den qualifizierten Namen angeben. Dieser Code zeigt, wie Sie den qualifizierten Namen der Klasse erhalten
und dann können Sie Typ mit qualifiziertem Namen erhalten
quelle
Wenn es sich um einen verschachtelten Typ handelt, vergessen Sie möglicherweise, a zu transformieren. zu einem +
Ungeachtet,
typeof( T).FullName
wird Ihnen sagen, was Sie sagen solltenBEARBEITEN: Übrigens sind die Verwendungen (wie Sie sicher wissen) nur Anweisungen an den Compiler zur Kompilierungszeit und können daher keinen Einfluss auf den Erfolg des API-Aufrufs haben. (Wenn Sie Projekt- oder Baugruppenreferenzen hatten, könnte dies möglicherweise Einfluss gehabt haben - daher sind die Informationen nicht nutzlos, es sind nur einige Filter erforderlich ...)
quelle
+
Trennzeichen verwenden)Ich öffne Benutzersteuerelemente in Abhängigkeit davon, auf welche Benutzersteuerelemente der Benutzer Zugriff hat, die in einer Datenbank angegeben sind. Also habe ich diese Methode verwendet, um den TypeName zu erhalten ...
Jetzt kann man den in strType zurückgegebenen Wert verwenden, um eine Instanz dieses Objekts zu erstellen.
quelle
Wenn ich nur den Klassennamen habe, verwende ich diesen:
quelle
Da Type.GetType (String) den Type.AssemblyQualifiedName benötigt , sollten Sie Assembly.CreateQualifiedName (String, String) verwenden .
Die Version, Culture und PublicKeyToken sind nicht erforderlich
assemblyName
, daher können Sie MyAssembly.GetName (). Name verwenden.Über Type.GetType (String) :
quelle
Wenn auf die Assembly verwiesen wird und die Klasse sichtbar ist:
GetType gibt null zurück, da der Typ nicht gefunden wird. Mit typeof kann der Compiler Ihnen helfen, den Fehler herauszufinden.
quelle
Versuchen Sie, den vollständigen Typnamen zu verwenden, der die Baugruppeninformationen enthält, zum Beispiel:
Ich hatte die gleiche Situation, als ich nur den Namen namesspace.classname verwendete, um den Typ einer Klasse in einer anderen Assembly abzurufen, und es würde nicht funktionieren. Funktionierte nur, wenn ich die Assembly-Informationen wie oben gezeigt in meine Typzeichenfolge aufgenommen habe.
quelle
Stellen Sie sicher, dass das Komma direkt hinter dem vollständig qualifizierten Namen steht
Da das nicht funktioniert
Ich war ein paar Tage lang ratlos
quelle
Für mich war ein "+" der Schlüssel! Dies ist meine Klasse (es ist eine verschachtelte):
und diese Codezeile funktionierte:
quelle
Diese obige Lösung scheint mir die beste zu sein, aber sie hat bei mir nicht funktioniert, also habe ich sie wie folgt gemacht:
Voraussetzung ist, dass Sie den Pfad der Baugruppe kennen. In meinem Fall weiß ich es, weil dies eine Assembly ist, die aus einem anderen internen Projekt erstellt wurde und im bin-Ordner unseres Projekts enthalten ist.
Für den Fall, dass ich Visual Studio 2013 verwende, ist mein Ziel .NET 4.0. Dies ist ein ASP.NET-Projekt, daher erhalte ich den absoluten Pfad über
HttpContext
. Ein absoluter Pfad ist jedoch keine Voraussetzung, wie es aus MSDN auf AssemblyQualifiedNames hervorgehtquelle
I habe betrogen. Da die Typen, die ich erstellen möchte (nach Namen), alle in einer von mir gesteuerten DLL enthalten sind, füge ich einfach eine statische Methode in die DLL in der Assembly ein, die einen einfachen Namen annimmt, und rufe type.GetType aus diesem Kontext auf und gibt das Ergebnis zurück .
Der ursprüngliche Zweck bestand darin, dass der Typ in den Konfigurationsdaten namentlich angegeben werden konnte. Ich habe seitdem den Code so geändert, dass der Benutzer ein zu verarbeitendes Format angegeben hat. Die Formathandlerklassen implementieren eine Schnittstelle, die bestimmt, ob der Typ das angegebene Format analysieren kann. Ich benutze dann Reflection, um Typen zu finden, die die Schnittstelle implementieren, und einen, der das Format behandelt. Die Konfiguration gibt nun einen Formatnamen an, keinen bestimmten Typ. Der Reflection-Code kann benachbarte DLLs betrachten und laden, sodass ich die Plug-In-Architektur eines armen Mannes habe.
quelle