【问题标题】:Method analysis using Reflection and CodeDom使用 Reflection 和 CodeDom 进行方法分析
【发布时间】:2013-05-14 01:46:31
【问题描述】:

这个问题的背景太详细了,无法在此处描述,并且可能会对回答产生不利影响,因此我不包括在内。我想在单元测试中断言有关方法的某些事情。其中一些事情可以使用反射来实现,例如try/finally块的格式、类字段和方法局部变量等。我已经知道类型和方法签名。

    protected override void OnTest ()
    {
        bool result = false;
        SomeCOMObject com = null; // System.__ComObject

        try
        {
        }
        finally
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(com);
        }

        return (result);
    }

我无法实现的是:

  • 该方法是否仅包含一个 return (result); 语句,以及该语句是否是函数中的最后一个语句。
  • System.__ComObject 类型的所有变量是否已在 finally 块中使用 System.Runtime.InteropServices.Marshal.ReleaseComObject(object) 手动取消引用。

由于其中一些事情无法使用反射实现,而且源代码文本分析远非理想,因此我转向 CodeDom 但无法掌握它。有人告诉我,从源代码创建表达式树是不可能的。也不可能从运行时类型创建表达式树。如果这是正确的,我如何利用 CodeDom 来实现上面列表中的内容?

我过去曾使用 CodeDom 来生成代码并将简单的代码类编译为程序集。但我不知道如何使用它来分析方法的内部结构。请指教。

【问题讨论】:

标签: c# .net reflection code-analysis codedom


【解决方案1】:

通常,编程语言中内置的反射不提供对函数内容的访问。所以你几乎不能通过反射来做到这一点。

如果您可以访问等效的字节码,您也许可以做到,但字节码不能真正回答有关方法的语法的问题,例如,“多少返回存在返回相同表达式的语句”。

如果你想推理代码,你需要推理源代码。这意味着您需要访问解析器,并且通常需要访问其他有用的事实(“X 的声明是什么?”、“X 和 Y 的类型是否兼容?”、“数据是否从 X 流向 Y?”)等。

Roslyn 提供了其中的一些信息。还有商业解决方案(我有一个)。

【讨论】:

  • 谢谢。我是否正确理解 CodeDom、Roslyn 和其他商业解决方案在公开编译器类型和服务的相同原则上运行?我也想知道您使用哪种解决方案,因为我正在研究长期使用什么。
  • 我公司提供 DMS Software Reengineering Toolkit,该工具包明确旨在提供支持多种计算机语言的解析、名称解析、流分析、源代码转换等服务,具体程度取决于客户兴趣和以前的应用程序。您对 C# 的具体问题(“该方法是否只包含 1 个返回,并且是最后一条语句?”可以使用 DMS 的 C# AST 很容易地回答。请参阅semanticdesigns.com/Products/DMS/DMSToolkit.html
  • 谢谢。也许您的销售团队中的某个人可以就产品以及它在 CodeCom 和 Roslyn 之外提供的内容向我提供教育。如果是这样,请随时使用我的个人资料联系信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
相关资源
最近更新 更多