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% 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:
.. 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 ...
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:
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.
Tags und Links c# lambda reflection visual-studio-2012 methodinfo