Conversion Lambda en arbre D'Expression

Je vais rester très simple,

Comment puis-je sortir l'arbre d'expression de lambda??

Ou à partir d'une expression de requête ?

37
demandé sur Prashant C 2009-08-21 12:40:23

3 réponses

Vous devez affecter le lambda à un type différent:

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

La même chose vaut pour les arguments de méthode. Cependant, une fois que vous avez assigné une telle expression lambda à un type Func<>, vous ne pouvez pas récupérer l'arborescence des expressions.

52
répondu Konrad Rudolph 2013-12-18 19:33:33

La réponse de Konrad est exacte. Vous devez affecter l'expression lambda à Expression<Func<...>> pour que le compilateur génère l'arborescence des expressions. Si vous obtenez un lambda comme un Func<...>, Action<...> ou un autre type de délégué, tout ce que vous avez est un groupe d'instructions IL.

Si vous avez vraiment besoin de pouvoir convertir un lambda compilé par IL en un arbre d'expression, vous devrez le décompiler (par exemple, faire ce que fait L'outil réflecteur de Lutz Roeder). Je suggère de jeter un oeil à la bibliothèque Cecil , qui fournit un support avancé de manipulation IL et pourrait vous faire économiser un certain temps.

10
répondu Pierre Arnaud 2009-08-21 08:57:51

Juste pour développer la réponse de Konrad, et pour corriger Pierre, vous pouvez toujours générer une Expression à partir d'un lambda compilé par Il, bien que ce ne soit pas terriblement élégant. Augmenter L'exemple de Konrad:

// Gives you a lambda:
Func<int, int> f = x => x * 2;

// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);
6
répondu joniba 2011-01-18 14:43:42