表达式树:从MethodCallExpression获取语句

时间:2010-08-23 15:20:54

标签: c# .net expression-trees

我在确定好标题时遇到了一些问题,但希望这篇文章中的代码示例足够清晰。

在表达式树(或其他一些技术)的帮助下,是否有可能遍历整个方法“call stack”?换句话说:当我从Action-delegate获取表达式树时,我想遍历委托内发生的语句。

我认为最好尽快进入示例......我有一个名为Command的抽象类。命令内部有以下方法:

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

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-executions:

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

输出是:执行。所以这并没有把我带走。是否有可能触及Execute-method中的语句?

1 个答案:

答案 0 :(得分:2)

不 - 你不能这样做。表达树只能和lambda本身一样深。