如何从 Roslyn 的“BaseList”中的接口区分类?

And*_*dry 5 .net c# syntax roslyn

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

  • 它的基类
  • 其实现的接口

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

ClassDeclarationSyntax node = ...; // The class declaration
BaseListSyntax baseList = node.BaseList;
Run Code Online (Sandbox Code Playgroud)

但是同时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);
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 4

是的。

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

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