Reverse of Expression > .Compile ()?

.net c# expression-trees lambda linq

Domanda

Dal momento che possiamo:

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

Come posso:

Func<int,bool> predicate = x => x > 5;
Expression<Func<int,bool>> exp = predicate.Decompile();

Cioè, voglio ottenere l' Expression corrispondente di Func . È possibile?

Risposta accettata

Non c'è Decompile() magico Decompile() per un'istanza delegata , a meno di decostruire l'IL (forse con mono.cecil). Se si desidera un albero di espressioni, sarà necessario iniziare con un albero di espressioni, quindi avere Expression<Func<int, bool>> througout.

Come un caso limite, è possibile ottenere informazioni di base metodo delegato del delegato .Method (il MethodInfo ) e .Target ( arg0 ) - tuttavia, per la maggior parte degli scenari che coinvolgono un lambda o metodo anonimo questo punterà al metodo di compilatore di generare su la classe di acquisizione, quindi non ti aiuterà molto. È praticamente limitato a scenari come:

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

Risposta popolare

Passa il lambda a un metodo che accetta un'espressione <> e il compilatore C # ti passerà un albero di espressioni in fase di runtime. Tuttavia questo funziona solo se si passa direttamente lambda, non se si tenta di passare un'istanza delegata creata da un lambda.

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

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

L'opzione più vicina che ho trovato per decompilare un'istanza delegata è dettagliata in questo post del blog di Jean-Baptiste Evain che lavora nel team Mono . Usa l'eccellente progetto Mono.Cecil per decompilare l'IL in un AST personalizzato, quindi lo mappa nel miglior modo possibile nelle espressioni LINQ.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché