带Collect()的增量源代码生成器:目标程序集如何确定?
增量源代码生成器中Collect()对目标程序集的影响
示例代码
public override void Initialize(IncrementalGeneratorInitializationContext context) { var provider = context.SyntaxProvider.CreateSyntaxProvider(FilterSyntaxNode, TransformSyntaxNode) .Where(model => model is not null) .Collect(); context.RegisterSourceOutput(provider, GenerateSource!); }
调用Collect()后,GenerateSource方法的参数会从单个TModel变为ImmutableArray<TModel>,需要接收合并后的模型集合。
当前程序集结构
- Application项目引用Domain项目
- Domain项目引用源代码生成器包
未使用Collect()的生成规则
在不调用Collect()的生成器中,生成代码的归属逻辑清晰:基于Domain程序集内类型生成的代码会被放入Domain程序集,基于Application程序集内类型生成的代码则进入Application程序集。
调用Collect()后的目标程序集规则
当通过Collect()合并来自不同程序集的输入后,所有生成的代码都会统一归属到直接引用源代码生成器的程序集——也就是这里的Domain程序集。
这是因为源代码生成器的运行上下文由直接引用它的项目(Domain)决定。即便Application项目通过引用Domain间接使用了生成器,生成器的代码输出只会绑定到直接引用它的程序集,不会分散到多个程序集中。
内容的提问来源于stack exchange,提问作者Timo
相关产品推荐
相关产品推荐

