8
votes

Obtenir le résultat d'une expression

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.

À ce stade, une fois qu'il est créé, je peux voir qu'il est de type expression , avec une valeur de {() => "myvalue". Startswith ("myv")} .

Je pensais à ce moment-là que je pourrais appeler var résultat = expression.invoke (expr, null); contre elle, et j'aurais mon résultat booléen. Mais cela vient de renvoyer une invocation une invocation , qui dans le débogueur ressemble à {invoke ((() => "myvalue" .startswith ("myv"))} .

Je suis à peu près sûr que je suis proche, mais je ne peux pas comprendre comment obtenir mon résultat!

Merci.


0 commentaires

3 Réponses :



2
votes

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: xxx

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.


1 commentaires

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.



1
votes

La façon dont je le ferais est levée à partir d'ici: exemple MSDN xxx pré>

aussi si vous souhaitez utiliser une expression expression code> alors cette page: Expression (Tdelegate) Classe (System.Linq.Expression) a l'exemple suivant: P>

// 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
*/


0 commentaires