Parámetro de unión en árboles de expresión

c# c#-3.0 expression-trees

Pregunta

Me gustaría saber cómo vincular parámetros a valores dentro de un árbol de expresión

Algo como

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

Entonces me gustaría unir y, al mismo tiempo que se conserva como una sola expresión. Un intento obvio sería algo como

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

Pero eso convertiría mi expresión en un nodo Invocar. ¿Hay una manera de simplemente enlazar un parámetro dentro de mi primera expresión mientras obtengo la firma de la segunda expresión?

Respuesta aceptada

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

esto usa ExpressionVisitor para reconstruir la expresión, sustituyendo y con la constante.

Otro enfoque es utilizar Expression.Invoke , pero esto no funciona en todos los casos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow