【问题标题】:Expression Tree: Modify operand using ExpressionVisitor表达式树:使用 ExpressionVisitor 修改操作数
【发布时间】:2012-11-04 04:07:14
【问题描述】:

我正在使用 C# 中的表达式树并想修改一个表达式。

我使用了这个example,但是在示例中它们重用了左右节点。我将如何修改任何一个节点?

我得到以下代码:

    [TestMethod]
    public void ExpressionDemo_ModifiesExpression()
    {
        var demo = new ExpressionDemo();

        var expression = demo.ModifyAddition((Expression<Func<int, int>>)(x => x + 1));
    }

我使用简单的 + 1 加法函数调用 ModifyAddition。我想将右操作数 (1) 修改为不同的整数。

public class ExpressionDemo : ExpressionVisitor
{
    public Expression<Func<int, int>> ModifyAddition(Expression func)
    {
        return (Expression<Func<int, int>>) Visit(func);
    }

    protected override Expression VisitBinary(BinaryExpression node)
    {
        if (node.NodeType == ExpressionType.Add)
        {
            Expression left = node.Left;

            Expression right = ???

            return Expression.MakeBinary(ExpressionType.Add, left, right);
        }

        return base.VisitBinary(node);
    }
}

我很困惑如何构造正确的右操作数,以便我可以返回一个新的 BinaryExpression。

【问题讨论】:

    标签: c# expression-trees


    【解决方案1】:

    只是想把x + y变成x + 1吗?如果是这样,我怀疑你只是想要:

    Expression right = Expression.Constant(1);
    

    (当然,您应该验证加法类型是否适用于整数。)

    如果这不是你想要做的,请更具体。

    【讨论】:

    • 我想将 x + 1 更改为 x + 2 (作为测试)并使用 Expression.Constant 正是它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    相关资源
    最近更新 更多