Ermittelt generischen Argumenttyp und Wert einer generischen Methode

8

Wie erhalten Sie den Argumentwert einer geschlossenen / konstruierten generischen Methode?

Es ist eine Weile her, dass ich Reflection nicht berührt habe. All das war auf meinem Rücken, ähm, was auch immer.

%Vor%

AKTUALISIEREN

Diese Frage ist absurd und daher vom Fragesteller geschlossen. Er möchte es behalten, nur um seinen Kindern zu zeigen, wie dumm Papa ist, wenn sie sich jemals als C # -Programmierer entpuppen.

    
Water Cooler v2 05.02.2013, 12:13
quelle

1 Antwort

8

Die kurze Antwort ist typeof (Q).

Die lange Antwort (die versucht zu erklären, warum Sie diese Typen nicht aufzählen können und Sie müssen sie spezifisch schreiben) geht so:

Jede generische Methode (die generischer ist als die deklarierende Klasse) hat entsprechende, eindeutige MethodInfo-Instanzen für alle ihre (immer) berührten Partikularisierungen und eine andere MethodInfo für die "template" / open-Methode.

Sie können dies verwenden, um zu erhalten, was Sie wollen:

%Vor%

Warum ist das? Dies liegt daran, dass keine der "Aufzählungsoperationen" in der Reflection MethodInfo-Instanzen zurückgibt, die sich auf abgeschlossene Partikularisierungen beziehen.

Wenn Sie die von ConcreteFoo deklarierten statischen Methoden wie folgt aufzählen:

%Vor%

Sie erhalten identische Ergebnisse. Soweit es GenericMethod und seine Entourage von Besonderheiten betrifft, werden Sie nur das Reflection-Objekt erhalten, das mit GenericMethod verknüpft ist (offene Variante).

atTime2 wird keine zusätzliche MethodInfo enthalten, die sich auf das frisch jitterte GenericMethod & lt; bool & gt;.

Aber das ist nicht wirklich schlecht, oder? GetMethods () sollte konsistente Ergebnisse zurückgeben und die Ergebnisse nicht zeitlich variieren. Die Algebra der generischen Methoden ist eigentlich ziemlich nett, wenn es um die "Navigations" -Operationen geht:

  1. Alle geöffneten MethodInfos haben IsGenericMethod = true und IsGenericMethodDefinition = true
  2. Alle geschlossenen MethodInfos haben IsGenericMethod = true und IsGenericMethodDefinition = false
  3. Wenn Sie .GetGenericMethodDefinition () auf einer geschlossenen MethodInfo aufrufen, erhalten Sie die offene Methode
  4. Durch Aufrufen von .MakeGenericType (params Type [] -Typen) auf einer geöffneten MethodInfo erhalten Sie, was auch immer Sie geschlossen haben (ohne syntaktisch zu wissen, was diese Typen sind und mit der Möglichkeit, eine Ausnahme zu erhalten, die where-Klauseln nicht zu beachten)

Das gleiche gilt für die Reflektionsoperationen, die aus der Perspektive des aktuellen Threads (und nicht aus der der Assemblys und Typen) stammen:

%Vor%

und

%Vor%

gibt niemals die tatsächlich geschlossenen Varianten generischer Methoden zurück (falls vorhanden) das sind tatsächlich auf der Oberseite oder während des aktuellen Call-Stack.

In gewisser Weise ist Ihre Frage nicht absurd, denn im Fall von GetCurrentMethod Sie können es leicht durch GetCurrentMethod plus MakeGenericMethod plus den syntaktisch verfügbaren typeof (Was auch immer) ersetzen, das können Sie nicht über Ihre Anrufer sagen.

Also ... für nicht-generische Methoden können Sie immer auf Ihren Stack schauen und genau wissen, was die Parametertypen dieser Methoden sind. Die Methoden, die einander aufgerufen haben und schließlich deine, wurden aufgerufen ... Aber für generische (die wirklich wirklich geschlossen sind, denn ich wiederhole, es ist unlogisch zu denken, dass eine generische Methode läuft und eine andere aufruft und von jemand anderem aufgerufen wurde (etc ) ist eine offene) Sie können die Arten der Parameter nicht herausfinden, genauso wie Sie die Werte der lokalen Variablen solcher Methoden nicht lernen können (die deterministisch sind, aber es wäre ein großer Fehler in der Leistung, das zu machen a Möglichkeit).

    
Eduard Dumitru 23.02.2013, 23:27
quelle

Tags und Links