2011-12-22 20 views
10

me gustaría saber cómo enlazar parámetros a los valores dentro de un árbol de expresiónel enlace de parámetros en los árboles de expresión

Algo así como

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

Entonces me gustaría unirse a, mientras que preservarlo como una sola expresión. Un intento obvio sería algo así como

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

Pero eso le daría la expresión en un nodo de invocación. ¿Hay alguna forma de vincular simplemente un parámetro dentro de mi primera expresión mientras obtengo la firma de la segunda expresión?

Respuesta

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

este utiliza ExpressionVisitor para reconstruir la expresión, sustituyendo y con la constante.

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

+0

Exactamente lo que quería. Como dijiste, la Invocación podría haber sido una solución alternativa, pero hubiera sido como una llamada fija en lugar de una sustitución de etiqueta como la que has proporcionado. Gracias. – Spooles

Cuestiones relacionadas