如果我想替换这个匿名方法:
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;
};
有办法吗?我该怎么做?
答案 0 :(得分: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)
您需要为MedhodInfo
表达Debug.WriteLine
提供Call
。块中的最后一个表达式(即a+1
)将被视为块的返回表达式。