如何从 Roslyn 的“BaseList”中的接口判断 类?
How to tell classes from interfaces in Roslyn's `BaseList`?
我正在使用 Roslyn 来分析 C# 代码。我需要做的一件事是分析 class 声明节点并获取有关以下内容的信息:
- 它的基础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
以了解类型。
我正在使用 Roslyn 来分析 C# 代码。我需要做的一件事是分析 class 声明节点并获取有关以下内容的信息:
- 它的基础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
以了解类型。