我正在使用Roslyn分析C#代码。我需要做的一件事情是分析类声明节点并获取有关以下信息:

  • 它的基类
  • 其实现的接口(interface)

  • 我可以访问类声明节点(类型ClassDeclarationSyntax),然后从那里可以访问BaseList:
    ClassDeclarationSyntax node = ...; // The class declaration
    BaseListSyntax baseList = node.BaseList;
    

    但是baseList包含接口(interface)和类。我需要从接口(interface)区分类。如何?

    我需要使用SemanticModel吗?

    我搜索了Roslyn's Wiki,发现可以从AST访问语义信息。
    SyntaxTree programRoot = ...; // Getting the AST root
    CSharpCompilation compilation = CSharpCompilation.Create("Program")
        .AddReferences(MetadataReference.CreateFromFile(
        typeof(object).Assembly.Location))
        .AddSyntaxTrees(programRoot);
    

    但是如何从这里获取那些信息呢?
    谢谢

    最佳答案

    是的。

    语法树只知道什么单词在哪里;它对标识符所指的一无所知。

    您需要从编译中获取SemanticModel),然后在列表中的每个标识符节点上调用GetSymbolInfo()。然后,您可以将符号转换为ITypeSymbol来查找类型。

    09-25 21:21