AX 2012中能否在类内声明自定义类的数组变量?
AX 2012中能否在类内声明自定义类的数组变量?
当然可以实现,但你用的写法不符合AX 2012的X++语法规范,所以才会报错。下面我给你讲正确的实现方式:
首先要明确:X++里对于自定义类的数组,不能直接用classX[]这种语法(这种写法仅适用于int、str这类基本数据类型),必须借助系统提供的Array类来实现。
正确的实现步骤
1. 先确保你的DataContract类定义正确
你的两个DataContract类基础结构是对的,这里可以保留:
[DataContractAttribute] public class classX { // 可以根据需求添加带DataMemberAttribute的成员变量和对应的get/set方法 } [DataContractAttribute] public class classY { // 我们在这里声明数组变量 }
2. 声明并初始化自定义类数组
分两种场景:
作为classY的成员变量:
先在类的声明段定义Array类型的变量,然后在构造方法里初始化,指定元素类型为你的自定义类:[DataContractAttribute] public class classY { Array error; // 声明成员变量 public void new() { super(); // 初始化数组:第一个参数指定类型为Class,第二个参数传入classX的类编号 error = Array::create(types::Class, classNum(classX)); } }作为方法内的局部变量:
直接在方法里声明并初始化即可:public void someMethod() { Array error = Array::create(types::Class, classNum(classX)); // 给数组添加元素的示例(注意X++数组索引从1开始) classX newObj = new classX(); error.value(1, newObj); }
几个关键注意点
- X++的数组索引是从1开始的,和很多常见语言(比如C#、Java)的0起始索引不一样,操作数组时要留意。
- 如果你需要对DataContract类进行序列化,记得给类里的成员变量加上
[DataMemberAttribute],否则序列化时会丢失数据。 - 用
Array类的value()方法可以读取或设置指定索引的元素,用lastIndex()可以获取数组当前的元素个数。
这样调整后,你就能在classY里正常使用存储classX对象的数组了。
备注:内容来源于stack exchange,提问作者RSD
相关产品推荐
相关产品推荐

