Hallo habe folgendes Problem:
Ich will eine Instanz einer Klasse erzeugen, dessen name in einem String steht.
Bisher habe ich es so gelöst:
[...]
public interfaceXY CreateXY(string ClassName)
{
switch (ClassName)
{
case "Klasse1":
return new Klasse1();
[...]
}
}
[...]
nun soll das ganze jedoch "dynamischer" werden (vorgabe). Wie kann ich dies machen?
müsste irgend wie mit Relections gehen, havbe jedoch schon 2 Tage daran rumgedocktert und nichts hinbekommen.
Mit dem Activator geht das.
Hallo apsevrellor,
Activator.CreateInstance
herbivore
Danke schon mal für die schnellen Antworten, leider funktioniert das Ganze bei mir nicht. Kann mir da jemand unter die Arme greifen?
[...]
interfaceXY Test = (interfaceXY)Activator.CreateInstance(null, ClassName);
[...]
Exception:
Der Typ Klasse1 in der Assembly TestKlasse, Version=1.0.3068.24432, Culture=neutral, PublicKeyToken=null konnte nicht geladen werden.
Naja die Fehlermeldung sagt doch schon viel aus. Ich denke er konnte die Klasse nicht finden die du in dem String angegeben hast.
Entweder du hast nen Tippfehler oder es fehlt eventuell ein Namespace
Nur die Kogge schwimmt! 😁
naja Schreibfehler kann ich ausschließen und beide Klassen sind im selben Namespace.
Sind sie auch in der selben dll/exe? ansonsten einfach mal "ClassName, assembly"
Hallo apsevrellor,
wenn der Typ in derselben DLL vorhanden ist und du den korrekten Namen des Typs (ggf. mit vorangestelltem Namespace) angibst, dann sollte es gehen. Wenn nicht, stimmen eine oder mehrere der genannten Voraussetzungen eben doch nicht.
herbivore
so, Danke schon mal! soweit funktioniert es jetzt, jedoch nur wenn ich den Namespacename voranstelle.
nun bekomme ich die exception, daß ich den Typ ObjectHandler nicht auf interfaceXY casten kann.
[...]
interfaceXY Test = (interfaceXY)Activator.CreateInstance(null, ClassName);
[...]
Wie kann ich dies umgehen?
Hi,
Man muss mindestens den FullQualifiedeName angeben (mit Namespace und Name), mit weniger kann der Activator nicht arbeiten.
Gruß
Juy Juka
Da wird die CLR schon recht haben. Blöde frage: Implementiert dein Type dieses Interface überhaupt?
Ansonsten ist es in der gleichen Version vorhanden? Kann er alle Referenzen finden?
HI,
Du must Activator.CreateInstanceAndUnwrap nutzen. Die Andere Methode gibt irgend ein Wrapper-Objekt zurück (welches natürlich nicht dein INterface implementiert).
Gruß
Juy Juka
In der Hilfe zu CreateInstance steht:
Verwenden Sie ObjectHandle.Unwrap zum Entwrappen des Rückgabewerts.
Kann es sein das wenn man ein Type-objekt zum erzeugen einer instanz übergibt man diese Methode nicht benötigt? Funktioniert bei mir nämlich. Ist das nicht eher für COM gedacht?
Hallo apsevrellor,
warum verwendest du nicht besser eine Überladung von Activator.CreateInstance, die Object statt ObjectHandle liefert?
herbivore