使用Telosys生成继承泛型基类的C#类及Guid主键配置问题
实现方案
1. 处理Telosys无内置Guid类型的问题
使用Telosys的类型别名映射机制即可解决:
- 在DSL模型中给Guid类型的字段统一标记为
string类型,同时用自定义标签标注实际类型为Guid,后续代码生成模板识别到该标签就把字段类型替换为System.Guid。 - 也可以直接在Telosys的类型映射配置文件中新增自定义类型映射规则,把你自定义的类型标识映射到C#的Guid类型。
2. 泛型基类主键的代码生成实现
你设想的用特殊元属性携带基类类型参数的方案可直接落地,步骤如下:
- 在每个实体的DSL定义里增加你提到的
metaproperty特殊属性,把泛型参数类型、主键名称等信息通过标签的结构化内容存储,比如示例里的typed_param:Guid,后续模板解析该内容即可拿到泛型参数值。 - 编写自定义Telosys代码模板时,遍历每个实体的属性,先提取
metaproperty里的typed_param值,生成继承声明时直接拼接为Entity<${参数值}>即可。 - 不需要在实体中重复定义Id字段,该字段已在基类实现,模板自动过滤掉
metaproperty这个虚拟属性,不生成到最终实体代码里即可。
参考Country实体DSL定义:
Country { metaproperty: string {#base @Label("typed_param:Guid;name:Id;form_sections:基础信息~1|其他信息~2;display_layout:rows(n)_cols(12)")} CountryName : string {@Label("form_section:~1;display_layout:row(1)col(1)colspan(12)")}; CountryCode : string {@Label("form_section:~1;display_layout:row(2)col(1)colspan(6)")}; }
按上述规则处理后,生成的代码完全符合你给出的预期结构。
3. 表单布局元数据的落地
- 代码生成阶段,把每个实体
metaproperty里的表单分栏信息、每个普通属性里的布局参数统一提取,序列化为JSON结构,和实体类代码一起输出到指定文件即可,比如每个实体对应一个{EntityName}FormConfig.json文件。 - 如果你开发了拖拽GUI配置工具,只需要把GUI输出的布局参数按约定的键值格式写入到对应属性的
@Label标签里即可,模板只负责读取解析不需要感知GUI逻辑,两端遵守同一套字段约定就能打通流程。
内容的提问来源于stack exchange,提问作者Rad
相关产品推荐
相关产品推荐

