表达式树中的绑定参数
本文关键字:绑定 参数 表达式 | 更新日期: 2023-09-27 18:18:42
我想知道如何将参数绑定到表达式树中的值
之类的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, 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]);
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
,但这并不是在所有情况下都有效。