Wie instanziiere ich eine Klasse die string name?
Ich habe eine abstrakte Klasse und ich wollen initalize es einer Klasse, die Sie erweitert.
Habe ich die Kind-Klassen-name als string.
Neben dieser...
String childClassString;
MyAbstractClass myObject;
if (childClassString = "myExtenedObjectA")
myObject = new ExtenedObjectA();
if (childClassString = "myExtenedObjectB")
myObject = new ExtenedObjectB();
Wie kann ich dies tun? Im Grunde, wie Schaffe ich das, wenn Aussagen hier?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schauen Aktivator.CreateInstance().
oder
GetType
Dokumentation für seinetypeName
parameter sagt "Die assembly Qualifizierter name sein, der Typ", Sie nicht wirklich brauchen, um den Namen der assembly. Wenn der Typ in der aufrufenden assembly, nur der namespace qualifizierten Typnamen ist ausreichend.Ich glaube, das sollte funktionieren:
Den
null
im ersten parameter wird standardmäßig auf das aktuelle ausführende assembly. Weitere Referenz: MSDNedit: vergaß zu werfen, um
MyAbstractClass
Hatte ich einige Schwierigkeiten der Umsetzung einige der Antworten hier, denn ich war zu instanziieren versucht, ein Objekt aus einer anderen Versammlung (aber in der gleichen Lösung). Also ich dachte, ich würde post, was ich gefunden habe, zu arbeiten.
Erste, der
Activator.CreateInstance
Methode hat mehrere überladungen. Wenn Sie nur anrufenActivator.CreateInstance(Type.GetType("MyObj"))
, geht davon aus, dass das Objekt definiert ist, in der aktuellen assembly, und es gibt eineMyObj
.Wenn Sie nennen Sie es, wie empfohlen, in den Antworten hier:
Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, dann ist es stattdessen gibt einObjectHandle
, und Sie müssen zu nennenUnwrap()
bekommen Sie Ihr Objekt. Diese überlastung ist nützlich, wenn Sie versuchen zu nennen eine Methode definiert, die in einer anderen assembly (BTW, können Sie diese überlastung in der aktuellen assembly, lassen Sie einfach dieAssemblyName
parameter null).Nun, ich fand, dass der Vorschlag über die Verwendung
typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
fürAssemblyName
tatsächlich gab mir Fehler und ich konnte nicht bekommen, dass, um zu arbeiten. IchSystem.IO.FileLoadException
(konnte nicht geladen, Datei oder assembly...).Was ich bekommen hab zu arbeiten, ist wie folgt: