在运行时更改表达式委托主体?

时间:2013-01-14 19:03:25

标签: c# .net .net-4.0 expression-trees

我有这个代码生成一个委托,它将myNumber乘以5

ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numMultiply = Expression.Multiply(numParam,five);

让我们创建委托:

Expression<Func<int, int>> lambda1 =
    Expression.Lambda<Func<int, int>>(
        numMultiply,
        new ParameterExpression[] { numParam });
Console.Write(lambda1.Compile()(4));

现在假设我要将此表达式树更改为Add而不是Multiply 这是新行:

BinaryExpression numAdd = Expression.Add(numParam,five);

但是如何更改lambda1以便现在使用numAdd代替multiply

1 个答案:

答案 0 :(得分:5)

你只需构建一个新的,然后编译它。

Expression<Func<int, int>> lambda1 =
     Expression.Lambda<Func<int, int>>(
         numAdd,
         new ParameterExpression[] { numParam });

来自MSDN page

  

表达式树应该是不可变的。这意味着如果要修改表达式树,则必须通过复制现有表达式树并替换其中的节点来构造新表达式树。您可以使用表达式树访问者遍历现有表达式树。

“应该是”这个短语有点奇怪但是当你看到API时,你会发现所有相关的属性(Body,Left,Right)都是只读的。