Laden...

Generics: Typparameter zu Laufzeit festlegen

12 Antworten
4,957 Aufrufe
Letzter Beitrag: vor 17 Jahren
Generics: Typparameter zu Laufzeit festlegen

Hallo Leute,

Ich habe eine Funktion:


public void MyFoo<T>()
{
}

wie wir alle wissen funktioniert dies:


MyFoo<Int32>();

Aber warum funktioniert dies nicht:


MyFoo<Type.GetType("System.Int32")>()

Bis Dann
Reverent

Hallo,

Weil der Typ beim aufruf einer generischen Methode/Klasse feststehen muss oder selbst als Generischer Parameter deklariert sein muss.

Wenn du mit Reflection arbeiten willst, musst du es so machen:


typeof (MyFooType).GetMethod ("MyFoo").MakeGenericMethod (typeof (System.Int32)).Invoke (myFooInstance, new object[]{});

Gruß
Juy Juka

Ja danke JuyJuka,

...oder selbst als Generischer Parameter deklariert sein muss

Was bedeuted dies?

Bis Dann
Reverent

Hallo Reverent,

Aber warum funktioniert dies nicht:

Typparameter müssen zur Compilezeit festgelegt werden. Das ist einfach so.

Du kannst aber MakeGenericMethod und Reflection verwenden, um den Typparameter auch zur Laufzeit festzulegen und die Methode dann aufzurufen.

herbivore

Hallo herbivore,

meinst du so wie JuyJuka das beschrieben hat!

Hallo Reverent,

ja, was mir allerdings erst nach dem Absenden aufgefallen ist.

herbivore

Hallo JuyJuka,

was ist mit "MyFooType" und "myFooInstance" gemeint ?

Hallo Reverent,

...oder selbst als Generischer Parameter deklariert sein muss

Damit meinte ich, das in der aufrufenden Methode auch ein Generischer Typenparamter deklariert sein müsste, denn du dann wieder an die aufgerufene Methode (MyFoo) weiter geben könntest.

MyFooTyp
MyFooType ist die Klasse, in der du MyFoo deklariert hast.

myFooInstance
Da MyFoo nicht static ist, musst du eine Instanz / ein Objekt der Klasse in der MyFoo deklariert ist haben, um die Methode aufzurufen. Die hab ich halt mal myFooInstance genannt.

Gruß
Juy Juka

Hallo Reverent,

was ist mit "MyFooType" und "myFooInstance" gemeint ?

die Frage meinst du jetzt nicht ernst. Postet man einen Erklärung, wir Code gewünscht, postet man Code, wir eine Erklärung gewünscht. Es ist manchmal echt frustrierend. Hättest du, wie es [Hinweis] Wie poste ich richtig? Punkt 1.1 verlangt, in die :rtfm: Doku geguckt, hättest du selbst gesehen, was die Parameter bedeuten.

herbivore

Hallo Leute,

ich habe noch mal ein bisschen im Forum gesucht und noch eine weitere Lösung dazu gefunden!!

Danke an Euch beide!!

Das ist doch genau die gleiche Lösung, die du hier schon erhalten hast? ?(

Häufig ist es nicht sinnvoll eine generische Methode zu schreiben und diese dann per Reflection aufzurufen. Oft kann man das gleiche mit object erreichen, ohne viel ändern zu müssen.
Generics sind eine Hilfe für die Compile-Time, d.h. wenn man den Code eintippt. Steht der Typ zu dieser Zeit nicht fest, machen sie wenig Sinn.

PS:
Ausnahmen bestätigen hier natürlich die Regel. 😉