Parametro di associazione negli alberi di espressione

c# c#-3.0 expression-trees

Domanda

Mi piacerebbe sapere come associare i parametri ai valori all'interno di un albero di espressioni

Qualcosa di simile a

Expression<Func<String, String, bool>> e1 = (x,y) => x == y;

Quindi mi piacerebbe vincolarlo preservandolo come una singola espressione. Un ovvio tentativo sarebbe qualcosa di simile

Expresion<Func<String, bool>> e2 = x => e1(x, "Fixed Value Here");

Ma ciò trasformerebbe la mia espressione in un nodo Invoke. C'è un modo per associare semplicemente un parametro alla mia prima espressione mentre ottengo la firma della seconda espressione?

Risposta accettata

Expression<Func<String, String, bool>> e1 = (x,y) => x == y;

var swap = new ExpressionSubstitute(e1.Parameters[1],
    Expression.Constant("Fixed Value Here"));
var lambda = Expression.Lambda<Func<string, bool>>(
    swap.Visit(e1.Body), e1.Parameters[0]);

con

class ExpressionSubstitute : ExpressionVisitor
{
    public readonly Expression from, to;
    public ExpressionSubstitute(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }
    public override Expression Visit(Expression node)
    {
        if (node == from) return to;
        return base.Visit(node);
    }
}

questo utilizza ExpressionVisitor per ricostruire l'espressione, sostituendo y con la costante.

Un altro approccio è usare Expression.Invoke , ma questo non funziona in tutti i casi.



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é