如何在C#源生成器中访问其他文件的语法树以查找目标类?
解决C#源生成器跨文件查找Service结尾类的问题
你的判断完全正确——每个文件对应独立的语法树,仅遍历当前类所在的语法树自然无法获取其他文件的内容。要实现跨文件查找,需利用源生成器提供的GeneratorExecutionContext上下文对象,它包含了整个编译过程中的所有语法树与编译信息。
具体实现方案
- 从
GeneratorExecutionContext中获取全局编译对象Compilation - 遍历编译对象下的所有语法树
- 对每个语法树复用你原本的节点遍历逻辑,筛选名称符合要求的类
示例代码
// 在源生成器的Execute方法中接收GeneratorExecutionContext参数 public void Execute(GeneratorExecutionContext context) { var serviceClasses = new List<ClassDeclarationSyntax>(); // 遍历编译流程中的所有语法树 foreach (var syntaxTree in context.Compilation.SyntaxTrees) { // 可选:跳过自动生成的代码树,避免处理源生成器自身产出的代码 if (syntaxTree.IsGeneratedCode()) continue; var root = syntaxTree.GetRoot(context.CancellationToken); // 筛选当前语法树中名称包含"Service"的类 var currentFileServices = root.DescendantNodes() .OfType<ClassDeclarationSyntax>() .Where(n => n.Identifier.Text.Contains("Service")) .ToList(); serviceClasses.AddRange(currentFileServices); } // 后续处理收集到的所有Service类 }
优化建议
- 传入
context.CancellationToken支持取消操作,符合源生成器性能最佳实践 - 若需严格匹配以"Service"结尾的类,可将
Contains替换为EndsWith,避免误匹配类似"XyzServiceAbc"这类不符合预期的类 - 跳过自动生成的代码树,减少无意义遍历,提升生成效率
内容的提问来源于stack exchange,提问作者Omid.N
相关产品推荐
相关产品推荐

