Conversione di Lambda to Expression tree

c# expression-trees lambda

Domanda

Lo terrò molto semplice,

Come faccio a ottenere l'espressione albero da lambda ??

o dall'espressione della query?

Risposta accettata

Devi assegnare il lambda a un tipo diverso:

// Gives you a delegate:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;

Lo stesso vale per gli argomenti del metodo. Tuttavia, una volta assegnata un'espressione lambda a un tipo Func<> , non è possibile richiamare l'albero delle espressioni.


Risposta popolare

La risposta di Konrad è esatta. È necessario assegnare l'espressione lambda a Expression<Func<...>> affinché il compilatore generi l'albero delle espressioni. Se ottieni un lambda come Func<...> , Action<...> o altro tipo di delegato, tutto ciò che hai è un mucchio di istruzioni IL.

Se hai davvero bisogno di essere in grado di convertire un lambda compilato da IL in un albero di espressioni, dovresti decompilarlo (ad esempio, fai quello che fa lo strumento Reflector di Lutz Roeder). Suggerirei di dare un'occhiata alla libreria di Cecil , che fornisce un supporto avanzato per la manipolazione di IL e potrebbe farti risparmiare un po 'di tempo.



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é