39 votes

Conversion de l'arbre Lambda en expression

Je vais rester très simple,

Comment puis-je obtenir un arbre d'expression en lambda?

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

56voto

Konrad Rudolph Points 231505

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;
 

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

10voto

Pierre Arnaud Points 2306

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

Si vous avez vraiment besoin pour être en mesure de convertir un IL-compilé lambda de retour dans une arborescence d'expression, vous auriez à le décompiler (par exemple, faire ce que Lutz Roeder du Réflecteur outil ne). Je vous suggère de jeter un oeil sur le Cecil bibliothèque, IL offre des fonctions avancées de manipulation de soutien et pourrait vous faire économiser un peu de temps.

8voto

joniba Points 1010

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é avec 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);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X