我想知道如何将参数绑定到表达式树中的值
就像是
Expression<Func<String,String,bool>> e1 = (x,y) => x == y;
然后我想绑定y,同时将其保存为单个表达式.
一个明显的尝试就是这样
Expresion<Func<String,bool>> e2 = x => e1(x,"Fixed Value Here");
但是这会使我的表达式变成一个Invoke节点.有没有办法在获取第二个表达式的签名的过程中简单地绑定我的第一个表达式中的参数?
解决方法
Expression<Func<String,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]);
同
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); } }
这使用ExpressionVisitor来重建表达式,用常量代替y.
另一种方法是使用Expression.Invoke,但这在所有情况下都不起作用.