我有这个代码生成一个委托,它将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
?
答案 0 :(得分:5)
你只需构建一个新的,然后编译它。
Expression<Func<int, int>> lambda1 =
Expression.Lambda<Func<int, int>>(
numAdd,
new ParameterExpression[] { numParam });
来自MSDN page:
表达式树应该是不可变的。这意味着如果要修改表达式树,则必须通过复制现有表达式树并替换其中的节点来构造新表达式树。您可以使用表达式树访问者遍历现有表达式树。
“应该是”这个短语有点奇怪但是当你看到API时,你会发现所有相关的属性(Body,Left,Right)都是只读的。