Ich hatte einige Schwierigkeiten, einige der Antworten hier zu implementieren, weil ich versuchte, ein Objekt aus einer anderen Assembly zu instanziieren (aber in derselben Lösung). Also dachte ich, ich würde posten, was ich für die Arbeit gefunden habe.
Erstens weist die Activator.CreateInstance
Methode mehrere Überladungen auf. Wenn Sie nur aufrufen Activator.CreateInstance(Type.GetType("MyObj"))
, wird davon ausgegangen , dass das Objekt in der aktuellen Assembly definiert ist, und es wird a zurückgegeben MyObj
.
Wenn Sie es wie in den Antworten hier empfohlen aufrufen Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, gibt es stattdessen ein zurück ObjectHandle
, und Sie müssen es aufrufen Unwrap()
, um Ihr Objekt zu erhalten. Diese Überladung ist nützlich, wenn Sie versuchen, eine in einer anderen Assembly definierte Methode aufzurufen (Übrigens können Sie diese Überladung in der aktuellen Assembly verwenden, lassen Sie einfach den AssemblyName
Parameter null).
Nun stellte ich fest, dass der obige Vorschlag, typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
für AssemblyName
den ich ihn verwenden sollte, tatsächlich Fehler verursachte, und ich konnte das nicht zum Laufen bringen. Ich würde bekommen System.IO.FileLoadException
(konnte Datei oder Baugruppe nicht laden ...).
Was ich zur Arbeit gebracht habe, ist wie folgt:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();