获取类中的所有静态变量

时间:2011-03-17 15:49:31

标签: actionscript-3 class static properties

我有这个ObjectType类,它是一个帮助我做这样的事情的类:

object.type = ObjectType.TWO

//ObjectType.as
package
{
    public class ObjectType
    {
        public static var ONE:String = "one";
        public static var TWO:String = "two";
        public static var THREE:String = "three";

        public function ObjectType()
        {
        }
    }
}

假设我正在创建一个新类,我需要一个名为type的属性。在该属性集函数中,我想确保它的值是ObjectType变量之一。我怎样才能做到这一点?

public function set type(value:String):void 
{
    for (var o:Object in ObjectType) {
        if (value == o)
            this._type = value;     
        } else {
            //error
        }
    }
}

5 个答案:

答案 0 :(得分:6)

无法识别性能,但无需修改任何内容,您可以使用describeType函数检查静态字段并获取值:

function valueInClass(clazz:Class, value:*):Boolean {
 return describeType(clazz).variable.(clazz[@name.toString()] == value).length() != 0
}

public function set type(value:String):void 
{
 if (valueInClass(ObjectType, value)) {
  this._type = value;     
 } else {
  //error
 }
}

答案 1 :(得分:2)

我想你提出的第二个代码示例不起作用......

我认为这是因为你使用 for 循环有点不对。

for (var blah:String in somewhere){
    // blah represents a KEY of the somewhere object
    // to get the value of this key, use:
    var theValue = somewhere[blah];
}

每个循环的循环遍历值。但是现在我将用于

此外,它不是in ObjectType,而是在类'原型中,即in ObjectType.prototype

所以,解决这个问题:

for (var o:* in ObjectType.prototype) {
    if (value == ObjectType.prototype[o])
        this._type = value;     
    } else {
        //error
    }
}

答案 2 :(得分:1)

您可以使用反射解决此问题。

几天前问了一个类似的问题,你应该能够使用相同的解决方案,找到here

答案 3 :(得分:1)

应该注意的是,虽然接受的答案是对的,但它也很慢。不是你想要做的很多事情。有三种更简单的解决方案。

一:检查值本身:

public function set type(value:String):void 
{
    if( value != ObjectType.ONE && value != ObjectType.TWO && value != ObjectType.THREE )
        return;
}

显然,你检查的常数越多,就越难。

二:使用整数作为常量

将ObjectType类更改为使用ints:

public class ObjectType
{
    public static var NONE:int = 0;
    public static var ONE:int = 1;
    public static var TWO:int = 2;
    public static var THREE:int = 3;
    public static var TOTAL:int = 4;
}

注意那里的NONETOTAL?这样可以轻松检查您的值是否在正确的范围内:

public function set type(value:int):void 
{
    if( value <= ObjectType.NONE || value >= ObjectType.TOTAL )
        return;
}

您可以根据需要添加更多值,只需更新TOTAL即可继续使用。这需要每个值都按顺序排列。

三:使用枚举

虽然Flash没有针对枚举的内置类,但是有很多可用的解决方案。查看Scott Bilas的Enum课程:http://scottbilas.com/blog/ultimate-as3-fake-enums/

使用此作为您的基类,ObjectType类成为:

public final class ObjectType extends Enum
{

    { initEnum( ObjectType ); } // static ctor

    public static const ONE:ObjectType = new ObjectType;
    public static const TWO:ObjectType = new ObjectType;
    public static const THREE:ObjectType = new ObjectType;

}

现在你的支票变为:

public function set type(value:ObjectType):void 
{
    ...
}

在这里,你的setter现在变得类型安全,并且如果使用ObjectType以外的任何内容,则会抛出错误。

答案 4 :(得分:0)

事实证明,如果使用ENUM类型的检查,您应检查常量属性,而不是变量,如下例所示: ActionScript - Determine If Value is Class Constant