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

.NET6增量源代码生成器中WithTrackingName方法的功能与用法问询

IncrementalValuesProvider.WithTrackingName(string name) 详解

核心作用

说白了,这个方法就是给IncrementalValuesProvider实例加个自定义的「跟踪标签」,主要用来:

  • 调试时在诊断工具里快速识别不同的Provider:不管是Visual Studio的源代码生成器诊断窗口,还是dotnet build的详细日志,有了这个名称,你能一眼看出来哪个Provider触发了重新生成,或者哪个步骤出了性能问题。
  • 辅助Roslyn内部的增量跟踪逻辑:虽然底层是Roslyn用它来区分不同的Provider输出,但对开发者来说,最实用的还是调试诊断层面的价值。

使用方式

用法很简单,在创建或者转换Provider之后链式调用就行,名字尽量起得有意义,能体现这个Provider的功能:

[Generator]
public class MyGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        var classDeclarationProvider = context.SyntaxProvider
            .CreateSyntaxProvider(
                predicate: (node, ct) => node is ClassDeclarationSyntax,
                transform: (ctx, ct) => ((ClassDeclarationSyntax)ctx.Node).Identifier.Text);

        // 给Provider加跟踪名,明确是处理类声明的标识符提取
        classDeclarationProvider = classDeclarationProvider.WithTrackingName("ClassDeclaration_Identifier_Extractor");

        // 绑定生成逻辑
        context.RegisterSourceOutput(classDeclarationProvider, (spc, className) =>
        {
            spc.AddSource($"{className}.g.cs", $"public static class {className} {{}}");
        });
    }
}

注意点:

  • 名称要语义化,比如你这个Provider是提取类名的,就叫类似ClassDeclaration_Identifier_Extractor,别起模糊的名字。
  • 每个转换步骤(比如Select、Combine之后)都可以加独立的跟踪名,调试时能细化到每一步的变化。

适用场景

  • 排查增量更新异常:如果你的生成器在代码改动时莫名其妙触发了全量生成,或者某些变更没触发预期的更新,通过跟踪名称可以在诊断日志里定位到具体哪个Provider的输出变了。
  • 优化性能:要是生成器跑起来很慢,有了跟踪名你能快速找到哪个Provider的转换/筛选逻辑拖慢了速度,针对性优化。
  • 团队协作维护:多人开发同一个生成器时,清晰的跟踪名能让队友一眼看懂各个Provider的职责,不用翻一堆代码才明白。

内容的提问来源于stack exchange,提问作者StefanGP88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:35:30