Skip to content

FAQ 分册 5:高级输入与扩展链路

Q21:源生成器怎么读取 .graphql.json 这种非 C# 文件?

  • 症状:已经理解了基于 C# 语法树的生成器,但不知道如何读项目里的附加文件
  • 可能原因:把普通项目文件和 AdditionalFiles 混成了一回事
  • 解决方案:先在项目文件里把目标文件声明成 AdditionalFiles,再通过 AdditionalTextsProvider 接进增量管道,最后用 AdditionalText.PathGetText(...) 读取
  • 相关章节:第 12 章
  • 相关术语:AdditionalTextsProviderAdditionalTextCollect(...)

Q22:如果我还想让生成器读取项目配置或构建属性,应该看什么?

  • 症状:不只想读文件,还想根据项目配置决定是否生成
  • 可能原因:只知道 AdditionalTextsProvider,不知道配置输入对象
  • 解决方案:看 AnalyzerConfigOptionsProviderAnalyzerConfigOptions,通常先拿配置对象,再用 TryGetValue(...) 读具体字符串值
  • 相关章节:第 12 章
  • 相关术语:AnalyzerConfigOptionsProviderAnalyzerConfigOptions

Q23:怎么让生成器在 IDE 里显示错误、警告或提示?

  • 症状:已经发现了问题,但不知道怎么把它显示成真正的编译诊断
  • 可能原因:只创建了消息字符串,或者只 Diagnostic.Create(...) 没有上报
  • 解决方案:按这条链路理解:DiagnosticDescriptor -> Diagnostic.Create(...) -> ReportDiagnostic(...)
  • 相关章节:第 12 章
  • 相关术语:DiagnosticDescriptorDiagnosticLocationReportDiagnostic(...)

Q24:为什么有时候 AddSource(...) 直接传字符串,有时候又用 SourceText.From(...)

  • 症状:看到两个项目的输出写法不一样,不知道该选哪种
  • 可能原因:还没区分“简单字符串输出”和“显式文本对象输出”
  • 解决方案:简单场景直接传 string 即可;要显式指定编码或统一文本处理时,用 SourceText.From(...)
  • 相关章节:第 12 章
  • 相关术语:AddSource(...)SourceTextSourceText.From(...)

Q25:ForAttributeWithMetadataName(...)CreateSyntaxProvider(...) 应该怎么选?

  • 症状:继续看别的 sample 时,发现有的生成器按特性筛选,有的却自己写 CreateSyntaxProvider(...)
  • 可能原因:还没把“特性驱动筛选”和“语法形状驱动筛选”区分开
  • 解决方案:只要入口天然就是特性,就优先用 ForAttributeWithMetadataName(...);如果入口是“某种类声明、字段声明、枚举声明长什么样”,就看 CreateSyntaxProvider(...)
  • 相关章节:第 6 章第 12 章
  • 相关术语:ForAttributeWithMetadataName(...)CreateSyntaxProvider(...)GeneratorSyntaxContext

下一步去哪里

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