Деревья выражений: получение операторов из выражения MethodCallExpression - PullRequest
1 голос
/ 23 августа 2010

У меня были некоторые проблемы с поиском хорошего заголовка, но, надеюсь, примеры кода в этом посте достаточно понятны.

Можно ли с помощью деревьев выражений (или какой-либо другой техники) пройти весь метод "стек вызовов"?По-другому: когда я получаю дерево выражений от Action-делегата, я хотел бы пройтись по операторам, которые происходят внутри делегата.

Я думаю, что лучше перейти к примерам как можно скорее ... У меня есть абстрактный класс с именем Command.Внутри команды есть следующий метод:

protected void Run()
{
    RunCommand (() => this.Execute());
}

Выполнить - это абстрактный метод, который реализуется моими подклассами.Вот пример одного метода Execute:

    protected override void Execute()
    {
        var data = new RegistrationData {HomeTown = "town"};
        service.SendNewRegistration(data);
    }

В моем методе RunCommand я хотел бы получить инструкции внутри метода Execute.Метод определен следующим образом:

protected void RunCommand(Expression<Action> expression)
{
    // Is it possible to find out that we're calling SendNewRegistration
    // of a service-instance in our expression?

    expression.Compile().Invoke();
}

Перед вызовом Invoke, возможно ли выяснить, что происходит внутри подклассов Execute-method?Что объявляется, какие методы выполняются и какие параметры используются?

Я попытался расширить ExpressionVisitor , чтобы посмотреть, что происходит, и сделал это для регистрации посещений VisitMethodCall:

    protected override Expression VisitMethodCall(MethodCallExpression m)
    {
        Debug.WriteLine(m.Method.Name);
        return m;
    }

И вывод был: Выполнить.Так что это не привело меня далеко.Возможно ли как-то достичь операторов внутри метода Execute?

1 Ответ

2 голосов
/ 23 августа 2010

Нет - вы не можете сделать это. Деревья выражений уходят так глубоко, как сама лямбда.

...