Замена анонимных методов деревом выражений

Если я хочу заменить этот анонимный метод:

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();

(Я знаю: дерево выражений будет тайно динамически создавать другой метод anyous, но это не главное).

Теперь я хочу заменить следующий метод деревом выражений:

Func<int, int> f = delegate(int i)
{
     Debug.WriteLine("Inside the function!");
     return i + 1;
};

Есть ли способ и как мне это сделать?


person Martin Mulder    schedule 30.04.2013    source источник


Ответы (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) будет считаться возвращаемым выражением блока.

person Sergey Kalinichenko    schedule 30.04.2013