从零实现增量源生成器 · 第 5 / 17 篇

PostInitialization 为什么适合生成特性

把特性放到 PostInitialization 里生成,可以减少手写样板、降低接入成本,并让目标发现的入口更稳定。

当前主案例没有要求用户手写 [GenerateToString] 特性,而是直接在 RegisterPostInitializationOutput 里生成一份特性源码。

入口代码大致像这样:

context.RegisterPostInitializationOutput(static context =>
{
    context.AddSource("GenerateToStringAttribute.g.cs", "...");
});

为什么不手写特性

手写特性当然也能跑,但会带来两个额外负担:

  • 消费方必须先引用一份特性定义
  • 生成器入口和标记定义会分散在不同位置

把特性作为生成器的启动产物,最大的好处是接入成本会收缩。用户只需要引用生成器包,就能直接开始标记目标类型。

这一层为什么要尽量简单

PostInitialization 最适合做静态、稳定、没有业务分支的内容。

当前项目里它只负责一件事:把标记入口准备好。它不参与复杂判断,也不承担业务语义。这样做的好处是:

  • 失败点更少
  • 排错边界更清楚
  • 不会把入口阶段和业务规则阶段混成一团

特性生成的真正价值

它不是为了省那几十行代码,而是为了让整个教程的入口更统一:用户看见特性,生成器就有目标;生成器有目标,后面的发现、建模和渲染才开始有意义。

教程导航

继续阅读

当前文章已经挂到教程顺序中,建议按相邻章节继续。

上一篇 第一版 GenerateToString 生成器,先把主链路跑通 第一版生成器不求复杂,只求把入口、发现、诊断和输出这条最小闭环跑通。 下一篇 从入口方法看清主管线:生成器真正做了哪几步 入口方法不只是注册几个 API,它其实把整个生成器拆成了特性准备、目标发现、规格生成和源代码输出四个阶段。
查看系列目录 查看全部文章

标签

分类