Lambda-Ausdrücke T, FuncTIN, TOUT und MethodInfo

8

Beim Migrieren eines Projekts von VS2010 zu VS2012 ist folgendes Problem aufgetreten. Das Projekt verwendet Reflection sehr, und um das MethodInfo von einer Schnittstelle zu erhalten, wurde der folgende Code platziert:

%Vor%

Dies funktionierte gut mit VS2010 kompiliert, aber die MethodeCallExpression.Arguments.Count () war 2, wenn der Code mit VS2012 mit dem Ziel .NET 4.0 kompiliert wurde.

Nach dem Dekompilieren habe ich festgestellt, dass der Compiler unterschiedlichen Code für den gleichen Ausdruck erzeugt hat.

Das ist ein Designproblem, weil das Design nicht auf "magischen Zahlen" wie der Zahl 2 auf methodCallExpression.Arguments [2] weiterleiten sollte. Ich habe versucht, hierfür eine Lösung zu finden:

%Vor%

Aber äußerster Ausdruck ist null.

Schließlich habe ich es geschafft, den Ausdruck wie folgt zu ändern:

%Vor%

Es ist nicht ideal, aber es funktioniert sowohl auf VS2010 als auch auf VS2012.

Gibt es eine Möglichkeit, das MethodInfo von einem Ausdruck wie dem folgenden zu finden:

%Vor%     
Darien 28.08.2012, 20:08
quelle

1 Antwort

3

Ich bin nicht sicher, warum es einen Unterschied in der Art gibt, wie die Ausdrücke kompiliert werden. Wenn Sie jedoch nach der Methodeninformation der Methode im Konstantendelegaten suchen, können Sie den Ausdruck mit einer ITest -Implementierung kompilieren, um an die Delegierten MethodInfo zu gelangen. Zum Beispiel:

%Vor%

.. wobei Test eine Klasse ist und implementiert ITest . Das funktioniert sowohl in 2012 als auch in 2010.

Ich bin mir nicht sicher, wie Sie diese Methodeninformationen aus dem Ausdruck in 2012 erhalten können, ohne sie vorher zu kompilieren ...

UPDATE:

Wenn das Kompilieren des Ausdrucks keine Option ist, scheint es, dass der Compiler einen anderen Ausdruck generiert und das MethodInfo in die Eigenschaft MethodCallExpression.Object im C # 5-Compiler schreibt. Sie können überprüfen, ob diese Eigenschaft nicht null ist, und ihren Wert für die MethodInfo verwenden oder mit dem Abrufen eines Elements in der Arguments -Auflistung fortfahren. Zum Beispiel:

%Vor%

Ich verwende die LINQ-Abfrage, um auf das Element in der Arguments -Auflistung zuzugreifen, wenn Sie den fest codierten Index bevorzugen, könnten Sie das wahrscheinlich stattdessen verwenden. Eine umfassendere Fehlerprüfung ist ebenfalls erforderlich.

    
Peter Ritchie 28.08.2012, 21:34
quelle