You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:12:07