Obtenir le résultat d'une expression

c# expression-trees lambda

Question

J'ai créé une expression lambda au moment de l'exécution et je souhaite l'évaluer - comment puis-je le faire? Je veux juste exécuter l'expression elle-même, pas contre une collection ou d'autres valeurs.

À ce stade, une fois créé, je constate qu'il est de type Expression<Func<bool>> , avec la valeur {() => "MyValue".StartsWith("MyV")} .

Je pensais alors pouvoir appeler var result = Expression.Invoke(expr, null); contre cela, et j'aurais mon résultat booléen. Mais cela renvoie simplement une InvocationExpression , qui dans le débogueur ressemble à {Invoke(() => "MyValue".StartsWith("MyV"))} .

Je suis sûr que je suis proche, mais je ne vois pas comment obtenir mon résultat!

Merci.

Réponse acceptée

Essayez de compiler l'expression avec la méthode Compile , puis appelez le délégué renvoyé:

using System;
using System.Linq.Expressions;

class Example
{
    static void Main()
    {
        Expression<Func<Boolean>> expression 
                = () => "MyValue".StartsWith("MyV");
        Func<Boolean> func = expression.Compile();
        Boolean result = func();
    }
}

Réponse populaire

Comme Andrew l'a mentionné, vous devez compiler une expression avant de pouvoir l'exécuter. L’autre option est de ne pas utiliser d’expression du tout, ce qui ressemble à ceci:

Func<Boolean> MyLambda = () => "MyValue".StartsWith("MyV");
var Result = MyLambda();

Dans cet exemple, l'expression lambda est compilée lorsque vous générez votre projet, au lieu d'être transformée en un arbre d'expression. Si vous ne manipulez pas les arbres d'expression de manière dynamique ou n'utilisez pas une bibliothèque utilisant des arbres d'expression (Linq vers SQL, Linq vers entités, etc.), il peut être plus logique de le faire de cette façon.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi