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

Roy*_*mir 2 .net c# .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);
Run Code Online (Sandbox Code Playgroud)

让我们创建委托:

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

现在让我们说我要更改此表达式树Add而不是Multiply
这里是新行:

BinaryExpression numAdd = Expression.Add(numParam,five);
Run Code Online (Sandbox Code Playgroud)

但是我如何更改lambda1以便它现在将使用numAdd而不是multiply

Hen*_*man 5

你只需构建一个新的,并编译它.

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

MSDN页面:

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

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