用表达式树替换匿名方法

时间:2013-04-30 10:06:51

标签: c# anonymous-methods expressionbuilder

如果我想替换这个匿名方法:

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 个答案:

答案 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)将被视为块的返回表达式。