枚举类属性

时间:2013-07-22 18:49:13

标签: actionscript-3 dynamic reflection for-loop enumeration

我正在尝试遍历自定义类的属性,但methods provided by Adobe似乎不起作用。我没有收到编译或运行时错误。

package {   
    public dynamic class enum {
        public var foo:Number = 123;

        public function enum() {
            this.setPropertyIsEnumerable("foo", true);
            if (this.propertyIsEnumerable("foo") == false) {
                trace("foo:" + foo + " is not enumerable.")
            }
        }
    }
}

// outputs "foo:bar is not enumerable."

Implementaiton

var test:enum = new enum();
for (var property:String in test) {
    trace(property);
}

// outputs nothing

我尽量保持代码的快速性和灵活性,所以当您必须将类更改为Dynamic以便能够在属性上使用for ... in时,这真的很令人沮丧。 Jackson Dunstan's testing confirms that this can be 400x slower than static class properties,但必须明确引用(对于属性不可知的方法不切实际),或者使用类的反射(计算成本高)才能访问。

我发现回避整个问题的唯一方法是使用动态声明的变量......这是没有意义的,因为在那时使用setPropertyIsEnumerable(prop,true)是多余的;所有动态创建的属性已经可枚举。此外,动态变量不能强烈地进行数据类型化,并且性能会超出窗口。

例如......

package {   
    public dynamic class enum {
        public var foo:String = "apple";

        public function enum(){
            this.dynamicVar = "orange";
            this.dynamicProp = "banana";
            this.setPropertyIsEnumerable("foo", true);
            this.setPropertyIsEnumerable("dynamicProp", false);
        }
    }
}

实施

var test:enum = new enum();
for (var key:String in test) {
    trace(key + ": " + test[key]); // dynamicVar: 1
}

// outputs "dynamicVar: orange"

现在该类是动态的,我们看到只有3个测试属性中的一个被迭代。应该有2.

Adob​​e几乎感觉Adobe希望我们采用糟糕的编程习惯。言语让我失望......

1 个答案:

答案 0 :(得分:1)

非动态类不提供可枚举的属性或方法。

如您所提供的链接说明中所述。

  

Sets the availability of a dynamic property for loop operations.

我认为你可能想要在这种方法上重构你的代码。 我从来没有像你在这里那样遍历类属性。 如果要动态跟踪项目,则应使用关联数组,并以类似于您正在进行的类级别跟踪它们。
如果你想要强大的数据输入,那么使用矢量。