1. DynamicObject结构解析与核心概念
DynamicObject是金蝶云星空平台中用于表示单据数据的核心数据结构,它本质上是一个具有层次结构的动态对象容器。理解它的内部构造对于进行二次开发和插件编写至关重要。
1.1 基本层次结构
一个典型的单据DynamicObject包含以下层级:
- 根节点:包含所有单据头字段和单据体集合
- 单据体集合:DynamicObjectCollection类型,包含多个行对象
- 单据体行:每个行本身又是一个DynamicObject
- 基础资料字段:特殊类型的DynamicObject,包含引用对象的属性
这种嵌套结构使得DynamicObject能够完整表示业务单据的所有数据,包括主表信息、子表行记录以及各种关联的基础资料数据。
1.2 关键特性详解
字段存储机制:
每个字段在DynamicObject中都以键值对形式存储,键名对应字段的属性名(如"FBillNo"),值则是字段的实际数据。特别需要注意的是:
- 内码字段总是存储在索引0的位置
- 基础资料字段存储的是引用对象的DynamicObject
- 日期、金额等特殊类型有专门的转换处理方式
类型系统特点:
DynamicObject采用动态类型系统,这意味着:
- 字段值的实际类型需要在运行时确定
- 所有取值操作都需要进行类型转换
- 赋值时会自动进行类型兼容性检查
提示:在实际开发中,建议始终使用Convert类进行显式类型转换,避免直接强制类型转换可能引发的运行时异常。
1.3 与DynamicObjectCollection的关系
DynamicObjectCollection是DynamicObject的集合容器,专门用于管理单据体行数据。两者主要区别在于:
| 特性 | DynamicObject | DynamicObjectCollection |
|---|---|---|
| 用途 | 表示单行数据 | 管理多行数据集合 |
| 访问方式 | 键值对访问 | 集合索引访问 |
| 修改权限 | 可修改字段值 | 行集合本身只读,内容可修改 |
| 典型应用 | 单据头、单据体行 | 单据体行集合 |
这种设计使得数据操作既保持了灵活性,又通过集合类型提供了结构化访问方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础操作方法详解
掌握DynamicObject的基本操作是进行插件开发的基础。下面将详细介绍两种主流操作方法及其适用场景。
2.1 直接操作DynamicObject
这是最基础的操作方式,直接通过字段名访问数据包中的值。以下是典型操作示例:
csharp复制// 获取单据数据包
DynamicObject billObj = this.Model.DataObject;
// 读取单据内码(始终位于索引0)
long billId = Convert.ToInt64(billObj[0]);
// 文本字段操作
string billNo = Convert.ToString(billObj["BillNo"]);
billObj["BillNo"] = "NEW20230001";
// 日期字段处理
DateTime dateValue = Convert.ToDateTime(billObj["FDate"]);
billObj["FDate"] = DateTime.Now;
// 基础资料字段操作
DynamicObject supplier = billObj["FSupplier"] as DynamicObject;
if(supplier != null)
{
long supplierId = Convert.ToInt64(
