ActionScript - 确定值是否为类常量

时间:2011-03-10 22:24:15

标签: actionscript-3 constants

如果特定函数在没有传递值的情况下不起作用,我想抛出一个参数错误,该传递值也恰好是包含该函数的类的公共常量。

无论如何都要确定一个类是否拥有一个公共常量而不是必须遍历所有这些常量?

类似的东西:

public static const HALIFAX:String = "halifax";
public static const MONTREAL:String = "montreal";
public static const TORONTO:String = "toronto";

private var cityProperty:String;

public function set city(value:String):void
     {
     if (!this.hasConstant(value))
        throw new ArgumentError("set city value is not applicable.");

     cityProperty = value;
     }

public function get city():Strig
     {
     return cityProperty;
     }

目前,对于此功能,我必须编写像这样的城市设定函数:

public function set city(value:String):void
     {
     if (value != HALIFAX && value != MONTREAL && value != TORONTO)
        throw new ArgumentError("set city value is not applicable.");

     cityProperty = value;
     }

这是完成此任务的唯一方法吗?

3 个答案:

答案 0 :(得分:7)

是的,如果您使用反射:

private var type:Class;
private var description:XML;

private function hasConstant (str : String ) : Boolean 
{
    if (description == null) 
    {
        type = getDefinitionByName (getQualifiedClassName (this)) as Class;
        description = describeType (type);      
    }
    for each ( var constant:XML in description.constant) 
    {
        if (type[constant.@name] == str) return true;
    }
    return false;
}

请注意,要使其正常工作,所有常量必须始终为声明为public static const的String对象。

答案 1 :(得分:3)

我自己正在寻找这个问题的答案,并发现hasOwnProperty()对静态属性不起作用很烦人。事实证明,如果你将你的类转换为Class对象,它确实有效。

以下是一个例子:

public final class DisplayMode
{
  public static const one:   String = "one";
  public static const two:   String = "two";
  public static const three: String = "three";

  public static function isValid(aDisplayMode: String): Boolean {
    return Class(DisplayMode).hasOwnProperty(aDisplayMode);
  }
}

我欠了来自this discussion的jimmy5804的这个解决方案,所以对他说。

答案 2 :(得分:0)

您应该能够使用括号表示法来执行此操作。例如:

var foo:Sprite = new Sprite();
foo.rotation = 20;
trace( foo["x"], foo["rotation"]); // traces "0 20"

或更具体针对您的案例:

var bar:String = "rotation";
trace( foo[bar] ); // traces "20"

这里唯一需要注意的是,如果你要求不存在的对象属性,括号访问器将抛出一个ReferenceError,例如:

trace ( foo["cat"] ); // throws ReferenceError

但是如果要求静态属性,它就不会抛出:

trace ( Sprite["cat"] ); // traces "undefined"

因此,在您的情况下,您可以尝试:

if ( this[value] == undefined ) {
    throw new ArgumentError("set city value is not applicable.");
}

编辑: 对不起,我把const的名字和他们的价值混淆了。

为了解决您的问题,您必须使String值与const的名称相同,例如:

public static const HALIFAX:String = "HALIFAX";

然后你可以使用上面描述的查询,它会给你想要的结果。