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?
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:
Ü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.
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.
Tags und Links .net c# linq lambda expression-trees