如何在不编译项目的情况下获取类的元数据

时间:2014-03-15 15:12:29

标签: c# visual-studio vs-extensibility dataobjects.net

在我们的项目中,我们使用了大量的T4代码生成。我们使用一个名为DataObjects.Net的X-Tensive ORM。我们有点鸡蛋问题。在我们使用程序集的元数据生成代码之前,我们需要编译ORM的类。然后,当生成代码时,我们可以再次编译模型,但现在与生成的代码(部分类)组合。如果没有生成的代码,则无法编译模型类中的大多数自定义代码。

我们如何解决它是在VS2013中有一个名为'Model'的单独配置。在此配置中,存在“条件编译符号”调用“JUSTMODEL”。所有没有生成代码编译的代码都放在#if!JUSTMODEL #endif编译器指令之间,导致这些代码不能编译为“Model”配置。

这有点乏味。我们已经创建了一个可扩展的应用程序来自动化这个过程,但是运行过程会越来越耗费时间。

现在我想知道是否有可能获得Model程序集的元数据而不通过某种扩展性API构建程序集。我在Visual Studio中看到很多工具可以理解编辑器中加载的类并给我一些反馈(比如intellisense)。

2 个答案:

答案 0 :(得分:7)

有比NRefactor更好的方法。我在Visual Studio中发现了CodeModel。它为我提供了生成代码所需的所有元数据。你可以在网上找到很多关于如何在网上实现这一点的细节:

  1. Microsoft
  2. Tangible
  3. 和许多其他地方。由于数据的动态特性,编码与C#略有不同,但当你掌握它时,它非常容易且非常强大。

答案 1 :(得分:2)

我会考虑使用NRefactory库或类似的。 NRefactory的想法与Roslyn类似,所以应该解决你的问题。如果我理解正确,您需要在编译之前获得有关课程及其成员的信息。基于NRefactory的最简单的代码,负责检索类的列表以及有关方法和属性的信息,可以通过以下方式查看:

var parser = new CSharpParser();
var syntaxTree = parser.Parse(code);

var classes = syntaxTree.Descendants.OfType<TypeDeclaration>().Where(x => x.ClassType == ClassType.Class);
foreach (var typeDeclaration in classes)
{
    var result = typeDeclaration.Descendants.Where(d => d is MethodDeclaration || d is PropertyDeclaration);
    foreach (var declaration in result )
    {
        //...
    }
}

此示例仅执行源代码的语法分析。但是,您也可以使用 CSharpAstResolver 类对NRefactory执行语义分析。