在表达式目录树绑定参数 [英] Binding parameter in Expression trees

查看:198
本文介绍了在表达式目录树绑定参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何在表达式目录树中的绑定参数值



类似



<预类=郎-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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆