<0>很早的时候就支持通过平台python插件处理套打数据,但是当想过滤数据时返回数据对象给平台时都不知道怎么写,这里提供一个创建数据对象返回平台的方法。
Array.CreateInstance(type, len(tempList));
分析过程:
<1>直接创建,无法使用new语法
<2>List<T>.ToArray()? 理解面向接口编程
C# 语言默认提供的IList<T>列表接口实现默认就7种,像python这种第三方库本质上也是应该面向接口编程,如果了解星空是使用IronPython实现python语法的话(本质上也是一个C#的库,将python的语法用C#实现而已),查下github源码就知道了(源码面前了无秘密),最终的源码是IronPython.Runtime.List没有ToArray的公有接口
<3>IronPython.Runtime.List分析源码,本质上也是通过数组实现列表
本质上也是object[]实现列表,但是奈何没有实现这个列表的动态访问,无法访问内部属性
<4>再仔细分析,内部实现的拷贝都借助了一个静态类ArrayOps,分析静态类中提供的语法,最终找到一个Array.CreateInstance的方法,Array在python中属于一个动态类型,因此支持访问器内部方法
可能有些小伙伴不了解动态类型和静态类型,动态类型的意思是继承System.Dynamic.DynamicObject,通过实现TryGetMember和TrySetMember进行获取和设置内部成员(还包括其他接口),比如平台提供的实体服务规则和套打动态字段等。
<4>实现案例:过滤套打单据体的数据
from System import * from Kingdee.BOS import * from Kingdee.BOS.DataEntity import * def OnPrepareNotePrintData(e): if e.NotePrintTplId.Equals("648ff10a-0a6b-4327-93c6-cea80ddbf8b8"): if e.DataSourceId.Equals("FBottomEntity",StringComparison.OrdinalIgnoreCase): tempList = filter(lambda x:x["FBomLevel"] == 1, e.DataObjects); tempArray = Array.CreateInstance(e.DataObjects[0].GetType(), len(tempList)); for index in range(len(tempArray)): tempArray[index] = tempList[index]; e.DataObjects = tempArray;
若上代码异常,请使用附件的代码
KdPython.rar(0.41KB)
推荐阅读