Appearance
FAQ 分册 5:高级输入与扩展链路
Q21:源生成器怎么读取 .graphql、.json 这种非 C# 文件?
- 症状:已经理解了基于 C# 语法树的生成器,但不知道如何读项目里的附加文件
- 可能原因:把普通项目文件和
AdditionalFiles混成了一回事 - 解决方案:先在项目文件里把目标文件声明成
AdditionalFiles,再通过AdditionalTextsProvider接进增量管道,最后用AdditionalText.Path和GetText(...)读取 - 相关章节:第 12 章
- 相关术语:AdditionalTextsProvider、AdditionalText、Collect(...)
Q22:如果我还想让生成器读取项目配置或构建属性,应该看什么?
- 症状:不只想读文件,还想根据项目配置决定是否生成
- 可能原因:只知道
AdditionalTextsProvider,不知道配置输入对象 - 解决方案:看
AnalyzerConfigOptionsProvider和AnalyzerConfigOptions,通常先拿配置对象,再用TryGetValue(...)读具体字符串值 - 相关章节:第 12 章
- 相关术语:AnalyzerConfigOptionsProvider、AnalyzerConfigOptions
Q23:怎么让生成器在 IDE 里显示错误、警告或提示?
- 症状:已经发现了问题,但不知道怎么把它显示成真正的编译诊断
- 可能原因:只创建了消息字符串,或者只
Diagnostic.Create(...)没有上报 - 解决方案:按这条链路理解:
DiagnosticDescriptor -> Diagnostic.Create(...) -> ReportDiagnostic(...) - 相关章节:第 12 章
- 相关术语:DiagnosticDescriptor、Diagnostic、Location、ReportDiagnostic(...)
Q24:为什么有时候 AddSource(...) 直接传字符串,有时候又用 SourceText.From(...)?
- 症状:看到两个项目的输出写法不一样,不知道该选哪种
- 可能原因:还没区分“简单字符串输出”和“显式文本对象输出”
- 解决方案:简单场景直接传
string即可;要显式指定编码或统一文本处理时,用SourceText.From(...) - 相关章节:第 12 章
- 相关术语:AddSource(...)、SourceText、SourceText.From(...)
Q25:ForAttributeWithMetadataName(...) 和 CreateSyntaxProvider(...) 应该怎么选?
- 症状:继续看别的 sample 时,发现有的生成器按特性筛选,有的却自己写
CreateSyntaxProvider(...) - 可能原因:还没把“特性驱动筛选”和“语法形状驱动筛选”区分开
- 解决方案:只要入口天然就是特性,就优先用
ForAttributeWithMetadataName(...);如果入口是“某种类声明、字段声明、枚举声明长什么样”,就看CreateSyntaxProvider(...) - 相关章节:第 6 章、第 12 章
- 相关术语:ForAttributeWithMetadataName(...)、CreateSyntaxProvider(...)、GeneratorSyntaxContext