.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
相关产品推荐
相关产品推荐

