根据业务对象的元数据生成强类型实体类
金蝶云社区-云社区用户Z50R3113
云社区用户Z50R3113
2人赞赏了该文章 887次浏览 未经作者许可,禁止转载编辑于2019年07月28日 15:51:11

一、背景
在二次开发中,我们经常需要操作DynamicObject对象,比如单据的查询,更新,删除操作等。如下面的代码
[code]// 假设billObj是单据的数据包
DynamicObject billObj = this.Model.DataObject;

// 读取单据内码
long billId = Convert.ToInt64(billObj[0]);
// 普通文本字段(读取 + 设置)
string fldBillNoValue = Convert.ToString(billObj["BillNo"]);
billObj["BillNo"] = fldBillNoValue ;[/code]ref:【知识共享】单据数据包DynamicObject的结构及操作(url:https://vip.kingdee.com/article/2591

以上的代码在大部分情况下能正常工作,但是写起来比较费劲,也存在不方便的地方,比如:
1、获取单据编号的代码中“billObj["BillNo"]”,这里的“BillNo”字符串需要手动拼写,一不小心拼写错了,需要到程序运行时才能发现错误,这样就失去了C#作为强类型语言的优势
2、获取DynamicObject对象内的数据后,通常需要进行类型转换,比如这样:
string fldBillNoValue = Convert.ToString(billObj["BillNo"])。如果单据编号为null,就会报错“未将对象引用设置到对象的实例”。当然可以通过先检查是否为空,再进行转换来避免出错。但是当单据字段比较多时、需要取一整个单据体时、使用Linq时和避免频繁装箱拆箱等.......就显得比较麻烦了

那么有没有一种比较方便的方式来改善这些情况呢?答案是肯定的!如引入强类型实体类,并且把强类型实体类和DynamicObject进行自动转换。相信很多小伙伴也是这样做的,但是如果手工定义和转换的话,就比较繁琐了。

所以我们需要:

1、自动生成强类型实体类
2、DynamicObject和强类型实体类的自动转换(不在此文章中介绍)

我在论坛中寻找了关于强类型实体类的贴子,找到了一个:
https://vip.kingdee.com/article/285118653555662663,这个贴子的作者也想实现强类型的实体类,贴子回复中有一种方式是通过DynamicObjectView实现,个人对于这种方式并不满意,所以就自己实现了一个简单代码生成工具

二、自动生成强类型实体类工具

简介
使用此工具需要具备一定的K3Cloud开发经验,理解K3Cloud业务对象的基本概念
工具旨在提供一种方法来生成业务对象实体类
通过此工具,你可以把一个业务对象中关于数据库定义的部分,生成一个实体类,如下图

[float=left][/float]如何实现的?此工具通过读取业务对象的元数据和解析,把其中的单据体、字段等元素映射为类定义、属性定义,从而生成cs文件[float=left][/float]适合谁使用?从事K3Cloud的开发人员[float=left][/float]能做什么?[list=1]
[*]可以帮助开发人员节省定义业务对象实体类的时间
[*]开发人员可以自由修改此项目源代码以满足项目需要,如自定义命名空间、类名或者生成规则等
[*]作为ORM的一部分,实现Linq to K3Cloud
[/list]
[float=left][/float]如何使用?[list=1]
[*]把项目中使用到的Kingdee.BOS、Kingdee.BOS.Core、Kingdee.BOS.DataEntity、Kingdee.BOS.ServiceFacade.KDServiceClient、Kingdee.BOS.ServiceFacade.KDServiceClientFx这5个程序集的引用指向于K3Cloud的安装目录WebSite\bin文件夹下对应的程序集文件
[*]修改项目中App.config文件中的配置
[*]编译并启动项目,按照提示输入业务对象标识即可
[/list]
工具地址(github)金蝶K3Cloud业务对象实体类生成器https://github.com/hzhhhbb/Kingdee-K3Cloud-BusinessObject-Model-Generator

如有疑问或者建议等,欢迎通过在贴子留言、在github提issues和私信等方式告知我