2

我有这个代码,它产生一个委托,将 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

4

1 回答 1

6

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

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

MSDN 页面

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

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

于 2013-01-14T19:06:40.243 回答