Reflection - получить список вызовов методов внутри лямбда-выражения - PullRequest
5 голосов
/ 04 апреля 2009

Я пытаюсь найти способ получить список вызовов методов внутри лямбда-выражения в C # 3.5. Например, в приведенном ниже коде я хотел бы использовать метод LookAtThis (Action a) для анализа содержимого лямбда-выражения. Другими словами, я хочу, чтобы LookAtThis возвращал мне объект MethodInfo объекта Create.

LookAtThis(() => Create(null, 0));

Возможно ли это?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 04 апреля 2009

Это довольно просто, если вы используете Expression<Action> вместо Action. Полный код, включая информацию о том, как получить действительные значения, см. Здесь , в частности, ResolveMethod (и как он используется Invoke). Это код, который я использую в protobuf-net для выполнения RPC на основе лямбд.

2 голосов
/ 05 апреля 2009


using System;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Linq.Expressions;</p>

<p>class Program
{</p>

<pre><code>static void Create(object o, int n) { Debug.Print("Create!"); }

static void LookAtThis(Expression<Action> expression)
{
    //inspect:
    MethodInfo method = ((MethodCallExpression)expression.Body).Method;
    Debug.Print("Method = '{0}'", method.Name);

    //execute:
    Action action = expression.Compile();
    action();
}

static void Main(string[] args)
{
    LookAtThis((Expression<Action>)(() => Create(null, 0)));
}

}

1 голос
/ 04 апреля 2009
1 голос
/ 04 апреля 2009
static MethodInfo GetMethodInfo<T>(Expression<Func<T>> expression)
{
    return ((MethodCallExpression)expression.Body).Method;
}
0 голосов
/ 04 апреля 2009

Практически говоря, нет, это невозможно с отражением. Отражение в первую очередь направлено на предоставление информации о проверке метаданных во время выполнения. То, что вы просите, - это фактическая информация о проверке кода.

Я считаю, что можно получить фактические байты, представляющие IL для метода во время выполнения. Однако это будет просто массив байтов. Вам придется вручную интерпретировать это в кодах операций IL и использовать это, чтобы определить, какие методы были вызваны. Это почти наверняка не то, что вы ищете.

Однако можно использовать лямбду дерева выражений и проанализировать ее для вызовов методов. Однако это не может быть сделано на любом произвольном лямбда-выражении. Это должно быть сделано лямбда-выражением дерева выражений.

http://msdn.microsoft.com/en-us/library/bb397951.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...