如何用Roslyn框架关联代码与using语句?查询CSharpSyntaxTree所属程序集
关于Roslyn关联代码片段与using语句及CSharpSyntaxTree程序集的解答
1. 能否借助Roslyn将代码片段关联到对应的using语句?
当然可以!Roslyn的语法分析+语义分析组合能力完全能实现这个需求,核心思路是通过语义分析把语法节点映射到实际的符号信息,再关联到对应的using语句:
- 先像你示例里那样,用
CSharpSyntaxTree.ParseText解析代码生成语法树,拿到CompilationUnitSyntax根节点,收集所有using语句; - 接着创建
Compilation实例(需要引用目标代码依赖的程序集),生成SemanticModel——这一步是关键,它能帮我们把纯语法节点转换成带上下文的符号信息; - 定位到你要关联的代码片段对应的语法节点(比如某个变量、方法、类型引用的节点),通过
SemanticModel.GetSymbolInfo或SemanticModel.GetTypeInfo获取对应的ISymbol对象; - 从符号中提取它所属的命名空间(
symbol.ContainingNamespace.ToString()),再和之前收集的using语句做匹配,就能找到对应的关联项。
举个贴合你示例框架的小片段:
// 假设已获取root语法根节点和semanticModel语义模型 var targetNode = root.DescendantNodes() .OfType<IdentifierNameSyntax>() .First(n => n.Identifier.Text == "ILogger"); // 定位到代码里的ILogger引用 var symbolInfo = semanticModel.GetSymbolInfo(targetNode); var targetNamespace = symbolInfo.Symbol.ContainingNamespace.ToString(); // 匹配对应的using语句 var matchedUsing = root.Usings.FirstOrDefault(u => u.Name.ToString() == targetNamespace);
2. CSharpSyntaxTree所属的程序集
你示例代码里的CSharpSyntaxTree属于**Microsoft.CodeAnalysis.CSharp**程序集,需要通过NuGet安装同名的包(Microsoft.CodeAnalysis.CSharp),并在代码中引入using Microsoft.CodeAnalysis.CSharp;命名空间才能使用这个类。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

