2013-04-30 63 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