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. 😉