用表达式树替换匿名方法

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个回答

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方法提供MethodInfo,并将其传递给Call表达式。块中的最后一个表达式(即a+1)将被视为块的返回表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接