RuntimeReflectionExtensions.GetRuntimeMethod funktioniert nicht wie erwartet

8

Hat jemand eine Ahnung, warum der Aufruf von GetRuntimeMethod für den folgenden Fall null zurückgibt?

%Vor%

Es sollte genauso funktionieren wie für:

%Vor%

Ich habe versucht, dies zu debuggen, indem ich den folgenden Code ausführe:

%Vor%

Zu meiner Überraschung gibt die erste Zeile eine Auflistung zurück, die die MethodInfo enthält, die ich abrufen möchte, und die zweite Zeile bestätigt, dass der erwartete Parametertyp IEnumerable & lt; & gt; ist.

Die beiden Methodensignaturen Cast und ToList sind ähnlich, und ich sehe keinen Grund, warum das MethodInfo für ToList fehlschlägt.

Dieser Code wird in einer Portable Class Library mit TargetFrameworkProfile auf Profile78 ausgeführt.

Danke!

Update: Bis ich eine gute Lösung habe, gibt es eine hässliche Abhilfe, die für mich funktioniert:

%Vor%     
Tiago M 23.01.2014, 12:14
quelle

2 Antworten

3

Ich habe die Unterschriften nachgeschlagen, und sie sehen so aus:

%Vor%

Ich glaube da könnte mit GetRunTimeMethod und Erweiterungsmethoden mit generischen Parametern etwas faul sein, da dies nicht funktioniert:

%Vor%

Ich habe mir etwas Zeit genommen und versucht, eine gültige Erweiterungsmethode für Ihr benötigtes Verhalten zu erstellen, und ich habe das folgende Code-Snippet erstellt. Es funktioniert für mich.

%Vor%

Wird wie folgt aufgerufen:

%Vor%

Im Folgenden habe ich die IL, die beim Zusammenstellen meines dritten Falls und Ihrer zwei Fälle erstellt wurde, angefügt. Keine der Methoden ToList erzeugt irgendein Ergebnis.

%Vor%     
flindeberg 23.01.2014, 12:47
quelle
0

Sie erwarten das ...

  

typeof (Enumerable) .GetRuntimeMethod ("ToList", neuer Typ [] {typeof (IEnumerable & lt; & gt;)});

... um das zurückzugeben ...

  

öffentliche statische Liste ToList (diese IEnumerable-Quelle);

... weil Sie annehmen, dass der Typ des Parameters source gleich typeof(IEnumerable<>) ist. Es ist nicht. Der Typ des Parameters source ist IEnumerable<TSource> , während typeof(IEnumerable<>) ersterer eine Instanziierung des Letzteren ist (was die generische Typdefinition ist) mit dem generischen Typparameter, der durch die Methode ToList definiert wird.

Im Allgemeinen ist es schwierig, eine einfache API für die Bindung an solche Methoden zu definieren, weil C # keine einfache Möglichkeit bietet, einen Typ zu erhalten, der einen generischen Parameter darstellt, der in einer Methode definiert ist.

    
Christopher King 15.08.2017 19:39
quelle