对象的集合

时间:2012-10-10 07:40:16

标签: collections x++ axapta dynamics-ax-2012

我想在X ++中存储对象列表。我在msdn中读到数组和容器无法存储对象,所以唯一的选择就是创建一个Collection列表。我编写了以下代码并尝试使用Collection = new List(Types::AnyType);Collection = new List(Types::Classes);,但两者都无效。请查看我是否在以下工作中犯了一些错误。

static void TestList(Args _args)
{
    List Collection;
    ListIterator iter;
    anytype iVar, sVar, oVar;

    PlmSizeRange PlmSizeRange;
    ;
    Collection = new List(Types::AnyType);

    iVar = 1;
    sVar = "abc";
    oVar = PlmSizeRange;
    Collection.addEnd(iVar);
    Collection.addEnd(sVar);
    Collection.addEnd(oVar);    

    iter = new ListIterator(Collection);
    while (iter.more())
    {
        info(any2str(iter.value()));
        iter.next();
    }
}

此外,我们不能将一些变量或对象转换为Anytype变量,我读出类型转换是以这种方式自动完成的;

anytype iVar;
iVar = 1;

但是在运行时抛出一个错误,预期类型是Anytype,但遇到的类型是int。

1 个答案:

答案 0 :(得分:6)

最后,anytype个变量采用首先分配给它的类型,以后不能更改:

static void Job2(Args _args) 
{
    anytype iVar;
    iVar = 1;             //Works, iVar is now an int!
    iVar = "abc";         //Does not work, as iVar is now bound to int, assigns 0
    info(iVar); 
}

回到第一个问题,new List(Types::AnyType)永远不会工作,因为addEnd方法在运行时测试其参数的类型,anytype变量将具有分配给的值的类型它

同样new List(Types::Object)只会存储对象,而不是intstr的简单数据类型。 它可能与您(和C#)所相信的相反,但简单类型不是对象。

还剩下什么?容器:

static void TestList(Args _args)
{
    List collection = new List(Types::Container);
    ListIterator iter;
    int iVar;
    str sVar;
    Object oVar;
    container c;
    ;
    iVar = 1;
    sVar = "abc";
    oVar = new Object();
    collection.addEnd([iVar]);
    collection.addEnd([sVar]);
    collection.addEnd([oVar.toString()]);
    iter = new ListIterator(collection);
    while (iter.more())
    {
        c = iter.value();
        info(conPeek(c,1));
        iter.next();
    }
}

对象不会自动转换为容器,通常您提供packunpack方法(实现接口SysPackable)。在上面的代码toString中使用了作弊。

另一方面,我没有看到您的请求的用例,列表应包含任何类型。它违背了其设计目的,List包含一个且只有一个类型,在创建List对象时定义。

除了列表other collections types,也许Struct符合您的需求。