2013-04-30 6 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(); 

은 (내가 아는 : 식 트리 것 비밀리에 다른 anymous 방법을 동적으로 만들지 만 요점은 아닙니다.

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) 

당신은 Call 표현에 Debug.WriteLine에 대한 MedhodInfo를 제공해야합니다. 블록의 마지막 표현식 (예 : a+1)은 블록의 리턴 표현식으로 간주됩니다.

+0

BlockExpression !!! 그게 내가 찾고 있던거야! –