如何从 Roslyn 的“BaseList”中的接口判断 类?

How to tell classes from interfaces in Roslyn's `BaseList`?

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

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

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

但是 baseList 包含接口和 classes。我需要区分 classes 和接口。怎么样?

我需要使用 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 以了解类型。