在表达式目录树绑定参数 [英] Binding parameter in Expression trees
问题描述
我想知道如何在表达式目录树中的绑定参数值
类似
<预类=郎-CS prettyprint-覆盖>
表达式来; Func键<字符串,字符串,布尔>> E1 =(X,Y)=>点¯x==ÿ;
然后我要绑定Y,同时保留它作为一个单一的表达。
有较明显的尝试会是这样
<预类=郎-CS prettyprint-覆盖>
中表达< Func键<弦乐,布尔> > E2 = X => E1(X,固定值这里);
但是,这会变成我的表情变成一个Invoke节点。有没有一个参数我的第一个表达式中的简单结合而获得第二个表达式的签名的方式?
表达式来; Func键<字符串,字符串,布尔>> E1 =(X,Y)=>点¯x==ÿ;
无功交换=新ExpressionSubstitute(e1.Parameters [1],
Expression.Constant(固定值这里));
变种波长= Expression.Lambda&所述; Func键&下;串,布尔>>(
swap.Visit(e1.Body),e1.Parameters [0]);
与
类ExpressionSubstitute:ExpressionVisitor
{
公共只读的,以表达;
公共ExpressionSubstitute(从表达,表达于)
{
this.from =距离;
this.to =来;
}
公众覆盖式访问(Expression节点)
{
如果(节点==从)返回;
返回base.Visit(节点);
}
}
这使用 ExpressionVisitor
来重新表达,替换是
与不变。
另一种方法是使用 Expression.Invoke
,但这并不适用于所有情况。
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?
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.
这篇关于在表达式目录树绑定参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!