J'ai créé une expression de Lambda au moment de l'exécution et je veux l'évaluer - comment puis-je faire ça? Je veux juste courir l'expression par elle-même, pas contre une collection ou d'autres valeurs. P>
À ce stade, une fois qu'il est créé, je peux voir qu'il est de type Je pensais à ce moment-là que je pourrais appeler Je suis à peu près sûr que je suis proche, mais je ne peux pas comprendre comment obtenir mon résultat! p>
Merci. P> expression
{() => "myvalue". Startswith ("myv")} code>. P>
var résultat = expression.invoke (expr, null); code> contre elle, et j'aurais mon résultat booléen. Mais cela vient de renvoyer une invocation
une invocation code>, qui dans le débogueur ressemble à
{invoke ((() => "myvalue" .startswith ("myv"))} code>. P >
3 Réponses :
Essayez de compiler l'expression avec le compiler code> une méthode> invoquant ensuite le délégué qui est renvoyé:
Merci exactement ce que j'avais manqué. Et clairement expliqué aussi :)
Juste un peu de sucre syntaxique. Vous pouvez remplacer les deux dernières lignes par une seule: Résultat booléen = Expression.com () () ();
Comme Andrew mentionné, vous devez compiler une expression avant de pouvoir l'exécuter. L'autre option est de ne pas utiliser d'expression du tout, que Woul Dlook comme ceci: Dans cet exemple, l'expression Lambda est compilée lorsque vous construisez votre projet, au lieu d'être transformé en un arbre d'expression. Si vous ne manipulez pas de manière dynamique des arbres d'expression ou d'utiliser une bibliothèque qui utilise des arbres d'expression (Linq à SQL, Linq aux entités, etc.), il peut donc avoir plus de sens de le faire de cette façon. P> P>
Dans ce cas, je crée de manière dynamique l'arborescence d'expression, de même que vous devrez compiler au moment de l'exécution. Merci quand même.
La façon dont je le ferais est levée à partir d'ici: exemple MSDN aussi si vous souhaitez utiliser une expression expression
// Lambda expression as executable code.
Func<int, bool> deleg = i => i < 5;
// Invoke the delegate and display the output.
Console.WriteLine("deleg(4) = {0}", deleg(4));
// Lambda expression as data in the form of an expression tree.
System.Linq.Expressions.Expression<Func<int, bool>> expr = i => i < 5;
// Compile the expression tree into executable code.
Func<int, bool> deleg2 = expr.Compile();
// Invoke the method and print the output.
Console.WriteLine("deleg2(4) = {0}", deleg2(4));
/* This code produces the following output:
deleg(4) = True
deleg2(4) = True
*/