2013-01-14 21 views
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

+1

'Expression'是不可变的;没有办法可以改变它。你唯一能做的就是根据你想要的改变创建一个新的Expression,并确保相关的变量引用新的Expression。 – Servy

回答

5

你只是建立一个新的,并编译它。

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

MSDN page

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

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

+0

无法修改现有的? –

+0

我以为这就是ecpression树的力量,所以我可以改变行为.... –

+0

你试过重新分配'numMultiply',然后再次编译表达式?在这种情况下,你应该把'numMultiply'重命名为像'operation'这样更通用的东西。 – Ameen