Umkehrung des Ausdrucks <Func<T,TResult> &gt; .Compile ()?

.net c# expression-trees lambda linq

Frage

Da können wir:

Expression<Func<int, bool>> predicate = x => x > 5;
var result = Enumerable.Range(0,10).Where(predicate.Compile());

Wie kann ich:

Expression<Func<int, bool>> predicate = x => x > 5;
var result = Enumerable.Range(0,10).Where(predicate.Compile());

Das heißt, ich möchte den entsprechenden Expression des Func . Ist es möglich?

Akzeptierte Antwort

Es gibt keine magische Decompile() für eine Delegateninstanz , kurz vor dem Dekonstruieren der IL (vielleicht mit mono.cecil). Wenn Sie einen Ausdruck Baum wollen, werden Sie mit einem Ausdrucksbaum beginnen müssen, so haben Expression<Func<int, bool>> througout.

Als Rand Fall können Sie grundlegende Methode delegieren Informationen aus den Delegierten erhalten .Method (die MethodInfo ) und .Target (die arg0 ) - aber für die meisten Szenarien ein Lambda oder anonymes Verfahren , welches diese an den Compiler generieren Methode verweisen auf die Capture-Klasse, also wird dir nicht wirklich viel helfen. Es ist ziemlich beschränkt auf Szenarien wie:

Func<string,int> parse = int.Parse;

Beliebte Antwort

Übergeben Sie das Lambda an eine Methode, die einen Ausdruck <> akzeptiert, und der C # -Compiler ü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.

var exp = Decompile(x => x > 5);

public Expression<Func<int, bool>> Decompile(Expression<Func<int, bool>> exp)
{
    return exp;
}

Die nächste Option, die ich zum Dekompilieren einer Delegierteninstanz gefunden habe, ist in diesem Blogbeitrag von Jean-Baptiste Evain beschrieben, der im Mono- Team arbeitet. Er verwendet das ausgezeichnete Mono.Cecil- Projekt, um die IL in eine benutzerdefinierte AST zu dekompilieren, dann mischt er sie so gut wie möglich in LINQ-Ausdrücke ein.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum