【问题标题】:Binding parameter in Expression trees表达式树中的绑定参数
【发布时间】:2011-12-22 22:40:08
【问题描述】:

我想知道如何将参数绑定到表达式树中的值

类似

Expression<Func<String, String, bool>> e1 = (x,y) => x == y;

然后我想绑定 y,同时将其保留为单个表达式。 一个明显的尝试是这样的

Expresion<Func<String, bool>> e2 = x => e1(x, "Fixed Value Here");

但这会将我的表达式变成一个 Invoke 节点。有没有办法在获取第二个表达式的签名时简单地在我的第一个表达式中绑定一个参数?

【问题讨论】:

    标签: c# c#-3.0 expression-trees


    【解决方案1】:
    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,但这并不适用于所有情况。

    【讨论】:

    • 正是我想要的。正如您所说, Invoke 可能是一种解决方法,但它就像一个固定调用,而不是您提供的标签替换。谢谢。
    猜你喜欢
    • 2019-05-16
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多