Appearance
FAQ 分册 1:入门与起步
Q1:什么是“编译时”生成代码?和反射有什么区别?
- 症状:知道程序会跑,但不明白生成器到底什么时候工作
- 可能原因:把“编译期补源码”和“运行时读元数据”混在一起了
- 解决方案:先记住最短区别。源生成器在编译时产出
.g.cs;反射在程序运行后读取类型信息 - 相关章节:第 1 章、第 2 章
- 相关术语:IIncrementalGenerator、AddSource(...)
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 章
- 相关术语:SourceProductionContext、CSharpGeneratorDriver.Create(...)
下一步去哪里
- 还是找不到目标类:看 FAQ 分册 2:目标筛选与信息提取
- 已经进入测试与调试:看 FAQ 分册 4:测试、调试与驱动结果
- 返回 FAQ 首页:看 常见问题与排错