Ottenere il risultato da un'espressione

c# expression-trees lambda

Domanda

Ho creato un'espressione lambda in fase di esecuzione e voglio valutarla - come faccio? Voglio solo eseguire l'espressione da sola, non contro alcuna raccolta o altri valori.

A questo punto, una volta creato, posso vedere che è di tipo Expression<Func<bool>> , con un valore di {() => "MyValue".StartsWith("MyV")} .

Ho pensato che a quel punto avrei potuto chiamare var result = Expression.Invoke(expr, null); contro di esso, e avrei il mio risultato booleano. Ma che solo restituisce un InvocationExpression , che nel debugger sembra {Invoke(() => "MyValue".StartsWith("MyV"))} .

Sono abbastanza sicuro di essere vicino, ma non riesco a capire come ottenere il mio risultato!

Grazie.

Risposta accettata

Prova a compilare l'espressione con il metodo Compile , quindi richiamando il delegato che viene restituito:

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();
    }
}

Risposta popolare

Come ha detto Andrew, devi compilare un'espressione prima di poterla eseguire. L'altra opzione è di non usare affatto un'espressione, che potrebbe apparire come questa:

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

In questo esempio, l'espressione lambda viene compilata quando si crea il progetto, anziché essere trasformato in un albero di espressioni. Se non si manipolano dinamicamente alberi di espressioni o si utilizza una libreria che utilizza alberi di espressioni (da Linq a Sql, da Linq a entità, ecc.), Allora può avere più senso farlo in questo modo.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché