Je vais rester très simple,
Comment puis-je obtenir un arbre d'expression en lambda?
ou à partir d'une expression de requête?
Je vais rester très simple,
Comment puis-je obtenir un arbre d'expression en lambda?
ou à partir d'une expression de requête?
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.
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.
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 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.