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;
};

有没有办法,我该怎么做?

4

1 回答 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)

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

于 2013-04-30T10:16:08.503 回答