2013-04-30 39 views
3

如果我要取代这个匿名方法:使用表达式树更换匿名方法与表达式树

Func<int, int> f = delegate(int i) 
{ 
    return i + 1; 
}; 

,它会是这样的:

ParameterExpression i = Expression.Parameter(typeof(int), "i"); 
Expression one = Expression.Constant(1, typeof(int)); 
Expression body = Expression.Add(i, one); 
Func<int, int> f = Expression.Lambda<Func<int, int>>(body, i).Compile(); 

(我知道:一个表达式树将暗中动态地创建另一个有意义的方法,但那不是重点)。

现在我想用一个表达式树替换下列方法:

Func<int, int> f = delegate(int i) 
{ 
    Debug.WriteLine("Inside the function!"); 
    return i + 1; 
}; 

有没有办法,我如何做到这一点?

回答

1

是的,你可以做替换。您当前的表达式的结构是这样的:

Expression.Lambda 
    Expression.Add 
     Expression.Parameter("a") 
     Expression.Constant(1) 

新表达的结构是这样的:

Expression.Lambda 
    Expression.BlockExpression 
     Expression.Call 
      Expression.Constant("Inside the function!") 
      MedhodInfo(Debug.WriteLine) 
     Expression.Add 
      Expression.Parameter("a") 
      Expression.Constant(1) 

您需要为Debug.WriteLine提供MedhodInfoCall表达。块中的最后一个表达式(即a+1)将被视为块的返回表达式。

+0

BlockExpression !!!那是我一直在寻找的! – 2013-04-30 10:21:39