我需要遍历用户定义对象的所有属性。如何在As3中创建一个Object Iterable? (我想在for ...每个循环中使用它。)
我试图扩展代理。
但不确定要为此实现哪些方法。
下面是我的班级,
[Bindable]
public class XYZ extends Proxy
{
public var aggTerRedQty:String;
public var aggNBPQtyUsrs:String;
public var termAllocUnloadQty:String;
public var effNomQty:String;
public var termAllocSplitFirm:String;
}
由于
答案 0 :(得分:1)
<强> [编辑] 强>
我在代码中犯了一个错误,支持for each
循环,编辑修复它。
基于documentation for the Proxy
class,我掀起了这个例子。我以前从来没有这样做,实现似乎有点奇怪。但是这段代码主要来自文档,它可以运行:您可以在扩展for each
的类上使用for in
循环或Proxy
循环。
主要课程:
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main():void
{
var obj:MyClass = new MyClass();
trace("for in loop output:");
for (var propertyName:String in obj)
{
trace("property: " + propertyName + " value: " + obj[propertyName]);
}
trace("for each loop output:")
for each (var item:Object in obj)
{
trace("current item: " + item);
}
}
}
}
扩展Proxy
的类:
package
{
import flash.display.Sprite;
import flash.utils.Proxy;
import flash.utils.flash_proxy;
use namespace flash_proxy;
public class MyClass extends Proxy
{
protected var _target:Object = { property1: property1, property2: property2, property3: property3, property4: property4 };
protected var _item:Array;
public function MyClass()
{
}
override flash_proxy function nextNameIndex (index:int):int {
// initial call
if (index == 0)
{
_item = new Array();
for (var x:* in _target)
{
_item.push(x);
}
}
if (index < _item.length)
{
return index + 1;
}
else
{
return 0;
}
}
override flash_proxy function nextName(index:int):String
{
return _item[index - 1];
}
override flash_proxy function nextValue(index:int):*
{
return _target[ _item[index -1] ];
}
override flash_proxy function getProperty(name:*):*
{
return _target[name];
}
public var property1:String = "Hi";
public var property2:Boolean = true;
public var property3:Object = { a: 1, b: false };
public var property4:Sprite;
}
}
控制台输出:
for in loop output:
property: property2 value: true
property: property4 value: null
property: property1 value: Hi
property: property3 value: [object Object]
for each loop output:
current item: true
current item: null
current item: Hi
current item: null
在进一步审核文档时,Proxy
类的实际实现可能还需要实现Proxy
类'setProxy()
方法。
答案 1 :(得分:0)
最简单的方法 - 创建数组或向量。或字典,如果你想按名称访问,用属性填充它,在该类中创建一个将遍历数组/向量/字典的函数。
示例:
public class Example
{
public var _properties:Vector.<String>; //this can be Dictionary or Array, depends what you need it for
public function Example()
{
_properties = new Vector.<String>;
_propertis.push(property1, property2, ...);
}
public function findProperty(someCondition:String):String
{
for(var i:int = 0; i < _properties.length;i++)
{
if(_propertis[i] == someCondition) return _properties[i];
}
}
}