Laden...

Klasse aus string instanzieren

Erstellt von apsevrellor vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.499 Views
A
apsevrellor Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren
Klasse aus string instanzieren

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.

2.760 Beiträge seit 2006
vor 15 Jahren

Mit dem Activator geht das.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo apsevrellor,

Activator.CreateInstance

herbivore

A
apsevrellor Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren

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.

140 Beiträge seit 2006
vor 15 Jahren

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! 😁

A
apsevrellor Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren

naja Schreibfehler kann ich ausschließen und beide Klassen sind im selben Namespace.

2.760 Beiträge seit 2006
vor 15 Jahren

Sind sie auch in der selben dll/exe? ansonsten einfach mal "ClassName, assembly"

A
apsevrellor Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren

@jaensen:
Jup sind in der selben dll!

49.485 Beiträge seit 2005
vor 15 Jahren

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

A
apsevrellor Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren

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?

2.187 Beiträge seit 2005
vor 15 Jahren

Hi,

Man muss mindestens den FullQualifiedeName angeben (mit Namespace und Name), mit weniger kann der Activator nicht arbeiten.

Gruß
Juy Juka

2.760 Beiträge seit 2006
vor 15 Jahren

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?

2.187 Beiträge seit 2005
vor 15 Jahren

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

4.939 Beiträge seit 2008
vor 15 Jahren

In der Hilfe zu CreateInstance steht:

Verwenden Sie ObjectHandle.Unwrap zum Entwrappen des Rückgabewerts.

2.760 Beiträge seit 2006
vor 15 Jahren

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?

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo apsevrellor,

warum verwendest du nicht besser eine Überladung von Activator.CreateInstance, die Object statt ObjectHandle liefert?

herbivore