У меня были некоторые проблемы с поиском хорошего заголовка, но, надеюсь, примеры кода в этом посте достаточно понятны.
Можно ли с помощью деревьев выражений (или какой-либо другой техники) пройти весь метод "стек вызовов"?По-другому: когда я получаю дерево выражений от 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?