Umkehrung von ExpressionFuncT, TResult.Compile ()?

8

Da können wir:

%Vor%

Wie kann ich:

%Vor%

Das heißt, ich möchte die entsprechende Expression der Func erhalten. Ist es möglich?

    
Danny Chen 28.09.2010, 05:04
quelle

4 Antworten

7

Es gibt keine magische Decompile() für eine Delegat Instanz, kurz vor der Dekonstruktion der IL (vielleicht mit mono.cecil). Wenn Sie einen Ausdrucksbaum möchten, müssen Sie mit einem Ausdrucksbaum beginnen, also haben Sie Expression<Func<int, bool>> througout.

Als Randfall können Sie grundlegende Methodendelegierteninformationen aus den .Method (die MethodInfo ) und .Target (die arg0 ) der Delegierten beziehen - für die meisten Szenarien jedoch Wenn Sie eine Lambda-Methode oder eine anonyme Methode verwenden, wird dies auf die Compiler-Generate-Methode der Capture-Klasse verweisen, was Ihnen nicht wirklich helfen kann. Es ist ziemlich beschränkt auf Szenarien wie:

%Vor%     
Marc Gravell 28.09.2010, 05:16
quelle
5

Übergeben Sie das Lambda an eine Methode, die einen Ausdruck <& lt; & gt; und den C # -Compiler akzeptiert Übergibt Ihnen zur Laufzeit einen Ausdrucksbaum. Dies funktioniert jedoch nur, wenn Sie das Lambda direkt übergeben und nicht, wenn Sie versuchen, eine Delegat-Instanz zu übergeben, die aus einem Lambda erstellt wurde.

%Vor%

Die nächste Option, die ich zum Dekompilieren einer Delegat-Instanz gefunden habe, ist in dieser Blogeintrag von Jean-Baptiste Evain, der an dem Mono -Team arbeitet. Er verwendet das ausgezeichnete Projekt Mono.Cecil , um die IL in eine benutzerdefinierte AST zu dekompilieren, dann mappt er sie so gut wie möglich in LINQ-Ausdrücke.

    
Nathan Baulch 28.09.2010 05:08
quelle
3

Sie können versuchen, meine Bibliothek zu verwenden:
Ссылка

Obwohl es möglicherweise nicht so funktioniert wie für die Ergebnisse von Compile() , da es ein DynamicMethod ist und IL davon zu bekommen, ist nicht einfach. Wenn Sie jedoch Ihre eigene IManagedMethod Implementierung für DynamicMethod implementieren, sollte es einfach funktionieren.

Ich habe vor, DynamicMethod Adapter zu implementieren, weiß aber noch nicht wann.

    
Andrey Shchekin 01.06.2011 19:14
quelle
1

Sie können den Delegaten nicht dekompilieren , aber Sie können sicherlich einen neuen Ausdrucksbaum erstellen, der den Delegaten einfach aufruft :

%Vor%     
Timwi 26.02.2011 18:44
quelle