Skip to content

FAQ 分册 1:入门与起步

Q1:什么是“编译时”生成代码?和反射有什么区别?

  • 症状:知道程序会跑,但不明白生成器到底什么时候工作
  • 可能原因:把“编译期补源码”和“运行时读元数据”混在一起了
  • 解决方案:先记住最短区别。源生成器在编译时产出 .g.cs;反射在程序运行后读取类型信息
  • 相关章节:第 1 章第 2 章
  • 相关术语:IIncrementalGeneratorAddSource(...)

Q2:为什么需要源生成器?手写代码不行吗?

  • 症状:觉得 ToString()、Builder、映射代码自己写也能写
  • 可能原因:还没有把“重复规则代码”和“手写业务代码”区分开
  • 解决方案:把源生成器理解成“自动生产重复规则代码”的工具,价值在于减少重复劳动和漏改风险
  • 相关章节:第 1 章第 11 章
  • 相关术语:RegisterPostInitializationOutput(...)RegisterSourceOutput(...)

Q3:生成的代码在哪里?我看不到文件

  • 症状:构建通过了,但项目树里看不到 .g.cs
  • 可能原因:把“加入编译输入”和“出现在源码目录”当成一回事
  • 解决方案:先去 obj/.../generated 查,再看 IDE 的 Analyzers / Generated Files
  • 相关章节:第 2 章第 5 章
  • 相关术语:AddSource(...)SourceProductionContext

Q4:为什么我的生成器没有运行?

  • 症状:构建后没有生成代码,也没有明显报错
  • 可能原因:最常见是 Analyzer 引用方式不对,或生成器类没有被正确识别
  • 解决方案:先检查三件事:是否加了 [Generator]、是否实现 IIncrementalGenerator、示例工程是否按 Analyzer 方式引用
  • 相关章节:第 3 章第 4 章
  • 相关术语:[Generator]IIncrementalGenerator

Q5:什么是 partial class?为什么必须用它?

  • 症状:代码生成了,但类型重复或成员合并失败
  • 可能原因:手写类和生成类没有通过 partial 合并
  • 解决方案:把用户类和生成类理解成“同一个类型拆到两个文件里写”,没有 partial 就无法合并
  • 相关章节:第 5 章第 9 章
  • 相关术语:AddSource(...)RegisterSourceOutput(...)

Q6:如何设置断点调试生成器?

  • 症状:大概知道哪里有问题,但不知道怎么跟踪到生成器代码
  • 可能原因:没有建立“生成器在编译阶段执行”的调试思路
  • 解决方案:固定顺序:先看 obj/generated,再跑测试工程,再在 Initialize(...)TransformClass(...)、输出方法里打断点
  • 相关章节:第 5 章第 12 章
  • 相关术语:SourceProductionContextCSharpGeneratorDriver.Create(...)

下一步去哪里

基于当前仓库文档副本构建的 VitePress 站点