如何在Roslyn's ' BaseList '中区分类和接口

本文关键字:中区 分类 接口 BaseList Roslyn | 更新日期: 2023-09-27 18:16:02

我使用Roslyn来分析c#代码。我需要做的一件事是分析类声明节点并获取关于:

的信息
  • 其基类
  • 其实现接口

我可以访问类声明节点(类型ClassDeclarationSyntax),从那里我可以访问BaseList:

ClassDeclarationSyntax node = ...; // The class declaration
BaseListSyntax baseList = node.BaseList;

baseList既包含接口又包含类。我需要区分类和接口。如何?

我需要使用SemanticModel吗?

我搜索了Roslyn的Wiki,发现可以从AST访问语义信息。

SyntaxTree programRoot = ...; // Getting the AST root
CSharpCompilation compilation = CSharpCompilation.Create("Program")
    .AddReferences(MetadataReference.CreateFromFile(
    typeof(object).Assembly.Location))
    .AddSyntaxTrees(programRoot);

但是如何从这里获得这些信息呢?由于

如何在Roslyn's ' BaseList '中区分类和接口

可以。

语法树只知道什么单词在哪里;它不知道标识符指的是什么

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