Natasha有自己的封装规则,这可以让封装者思路更加清晰,并让作品更加容易维护。
Operator 作为动态构建对外使用的操作类,一个 Operator 可大致由以下 3 部分组成:
作为 Operator 最重要的核心部分,Builder 主要为 Operator 提供委托,可以从外部接收配置,可以在内部组合模板并进行编译。
其大致分为两部分 Template 模板与 Compiler 编译器:
Template 构建模板
使用 Template 模板构建运行时脚本字符串,模板对外暴漏 API 以方便使用者组成编译字符串。
UsingTemplat 是 Natasha 内置模板,提供了从命名空间到完整对象的代码构建。
DelegateTemplate 是 Natasha 内置模板,提供了方法代码的构建。
FieldTemplate 是 Natasha 内置模板,提供了字段代码的构建。
PropertyTemplate 是 Natasha 内置模板,提供了属性代码的构建。
Compiler 编译器
编译器接收模板提供的字符串并进行编译,完成 Builder 的编译任务。
直接使用 Natasha 内置的 Builder 可以快速实现定制,例如: OopBuilder<TOperator> ,MethodBuilder<TOperator>。
前者为其提供对象构造模板,后者专注构建方法。
Operator 在 Builder 的基础上进行了 Package 封装,Operator 存储了 Builder 提供的编译结果,对外暴漏用户级别的 API 。
例如 Natasha 内置的 FastMethodOperator 在 MethodBuilder 的基础上进行了包装和简化,FastMethodOpeartor 的初始化函数中定制了一个专属自己的脚本构建流程,如下模板翻译成 public static
:
this.Access(AccessFlags.Public)
.Modifier(ModifierFlags.Static);
同时 MethodBuilder 的方法脚本需要 “寄生” 在一个类/接口/结构体中才能进行编译和使用,因此 MethodBuilder 内部有宿主 OopBuilder 来接收 MethodBuilder 产生的脚本,最后进行编译的是 OopBuilder , 同时 OopBuilder 有如下初始化:public static class {randomname} {}
。
ClassOptions(item => item
.Modifier(ModifierFlags.Static)
.Class()
.UseRandomName()
.HiddenNamespace()
.Access(AccessFlags.Public)
);