【问题标题】:Replacing anonymous methods with expression tree用表达式树替换匿名方法
【发布时间】:2013-04-30 10:06:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# anonymous-methods expressionbuilder


    【解决方案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 提供MedhodInfoCall 表达式。块中的最后一个表达式(即a+1)将被视为块的返回表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2013-04-24
      • 2013-07-16
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多