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

方法はありますか?どうすればこれを行うことができますか?

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)

MedhodInfo式にDebug.WriteLinetoを指定する必要がありますCall。ブロック内の最後の式 (つまりa+1) は、ブロックの戻り式と見なされます。

于 2013-04-30T10:16:08.503 に答える