能否在使用Source Generator的项目端对其进行配置?
Source Generator 流畅配置可行方案
方案1:程序集标记属性 + 增量生成器解析
你可以在Source Generator的配套类库中内置一套配置用Attribute,配合增量生成器的语法解析能力实现类流畅语法配置:
- 首先在Generator关联的公开类库中定义程序集级配置Attribute,参数支持委托传入配置项:
[AttributeUsage(AttributeTargets.Assembly)] public class GeneratorConfigAttribute : Attribute { // 委托参数用于接收流畅配置逻辑,实际解析由生成器完成 public GeneratorConfigAttribute(Action<GeneratorOptions> configure) {} }
- 使用方在项目中直接声明程序集级Attribute即可完成配置,写法接近流畅语法:
[assembly: GeneratorConfig(c => c.UseFormat("yyyy-MM-dd").EnableNullableAnnotation(true))]
- 你的Source Generator通过增量生成器的语法树扫描能力,匹配程序集级的自定义Attribute,提取Lambda表达式内的调用链参数即可解析出完整配置。
该方案所有逻辑都在单个Source Generator内完成,不需要额外嵌套Generator,实现成本低,对使用方的侵入性极小。
方案2:约定静态配置类解析
如果需要完全匹配你提到的generator.UseFormat(c)写法,可以通过约定固定命名配置类的方式实现:
- 约定使用方在项目中定义名为
SourceGeneratorConfig的静态类,在静态构造函数或者固定命名的方法中写流畅配置代码:
public static class SourceGeneratorConfig { static SourceGeneratorConfig() { generator.UseFormat(c => { c.DateFormat = "yyyy-MM-dd"; c.IgnoreNullField = true; }); generator.EnableAutoMapper(); } }
- 你的Source Generator在编译期扫描语法树中匹配命名的静态类,提取类内部的方法调用链,解析参数后即可完成配置应用。
该方案完全符合你期望的流畅语法写法,只需要在现有Generator的基础上扩展语法树扫描逻辑即可,不需要额外新增Generator组件。
方案3:MSBuild 属性传递封装
如果配置项较多、追求更高的解析效率,可以将流畅语法的配置项封装为C#扩展方法,配合MSBuild的CompilerVisibleProperty机制将序列化后的配置内容传递给Source Generator:
你需要为Generator配套一个小型编译时目标包,自动在编译前期收集使用方的配置内容,序列化后通过MSBuild属性传递给Generator,Generator不需要解析复杂语法树,直接读取属性值反序列化即可拿到配置,性能最优。
内容的提问来源于stack exchange,提问作者Luke Parker
相关产品推荐
相关产品推荐

