Reputation: 785
I would like to know how to bind parameters to values within an expression tree
Something like
Expression<Func<String, String, bool>> e1 = (x,y) => x == y;
Then I would like to bind y, while preserving it as a single expression. A obvious attempt would be something like
Expresion<Func<String, bool>> e2 = x => e1(x, "Fixed Value Here");
But that would turn my expression into an Invoke node. Is there a way to simply bind a parameter within my first expression while getting the signature of the second expression?
Upvotes: 10
Views: 2471
Reputation: 1062650
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]);
with
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);
}
}
this uses ExpressionVisitor
to rebuild the expression, substituting y
with the constant.
Another approach is to use Expression.Invoke
, but this doesn't work in all cases.
Upvotes: 18