如何从Roslyn的“BaseList”中的接口告诉类?

时间:2015-10-04 19:16:34

标签: c# .net syntax roslyn

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

  • 其基类
  • 其实施的接口

我可以访问类声明节点(类型ClassDeclarationSyntax),然后我可以访问BaseList

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

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

我是否需要使用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);

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

1 个答案:

答案 0 :(得分:3)

语法树只知道哪些词在哪里;它对标识符所指的内容一无所知。

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