Roslyn如何获取泛型类型对应的符号及声明语法引用
Roslyn泛型属性类型符号获取问题解答
- 你的猜测是正确的,
DeclaringSyntaxReferences返回为空的核心原因就是目标泛型类型定义在当前编译项目的外部程序集中。 - 关于你尝试的两类方案的问题解释:
SemanticModel.GetSymbolInfo(node.Type).Symbol返回null属于方法适用场景不匹配,GetSymbolInfo主要用于获取标识符、调用表达式等节点对应的符号,对于类型语法节点,正确的取值方式就是你用的SemanticModel.GetTypeInfo(node.Type).Type,这一步操作没有问题。DeclaringSyntaxReferences属性仅当符号是在当前编译上下文包含的语法树(即你当前项目的源码)中声明时,才会返回非空结果。如果类型来自外部引用,包括.NET基础类库、第三方NuGet包、仅通过dll引用的其他类库,这些程序集在编译时不会附带原始语法树信息,Roslyn语义模型无法获取到它们的声明语法节点,因此该属性固定为null。
- 验证方法:你可以在当前项目中自定义一个泛型类型,再声明对应类型的属性重新运行遍历逻辑,此时拿到的类型符号的
DeclaringSyntaxReferences必然是非空的,可直接定位到你写的泛型类型声明节点。
内容的提问来源于stack exchange,提问作者Desperado
相关产品推荐
相关产品推荐

