Actionscript 3 ActionScript-确定值是否为类常量

Actionscript 3 ActionScript-确定值是否为类常量,actionscript-3,constants,Actionscript 3,Constants,如果某个特定函数在没有传递值的情况下无法工作,我想抛出一个参数错误,该传递值恰好也是包含该函数的类的公共常量 有没有办法确定一个类是否拥有一个公共常量,而不必遍历所有这些常量 大概是这样的: public static const HALIFAX:String = "halifax"; public static const MONTREAL:String = "montreal"; public static const TORONTO:String = "toronto"; private

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

有没有办法确定一个类是否拥有一个公共常量,而不必遍历所有这些常量

大概是这样的:

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;
     }
目前,对于此功能,我必须编写如下的city setter函数:

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;
     }

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

是,如果使用反射:

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;
}

请注意,要使其工作,所有常量必须始终是声明的字符串对象
publicstaticconst

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

var foo:Sprite = new Sprite();
foo.rotation = 20;
trace( foo["x"], foo["rotation"]); // traces "0 20"
public static const HALIFAX:String = "HALIFAX";
或更具体地针对您的情况:

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.");
}

编辑: 对不起,我把常量的名称和它们的值混淆了

为了解决您的问题,您必须使字符串值与常量的名称相同,例如:

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

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

我自己也在寻找这个问题的答案,发现
hasOwnProperty()
不适用于静态属性,这让人恼火。但事实证明,如果将类强制转换为
对象,它确实可以工作

下面是一个例子:

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);
  }
}

我把这个解决方案归功于来自的jimmy5804,所以向他致敬。

为什么不使用更好的方法来解决这个问题呢。保留一个城市名称的私有静态数组,并检查数组中是否存在城市?我更希望使用常量保持代码提示可用。确定,但是如果我必须写两次常量,我也可以在city setter的条件中再写一遍,不同的是你可以在多个函数中迭代它们。枯燥的理想是永远不要重复你自己,但在这种情况下,最好是重复一次。这不是有点过于复杂了吗?这取决于你试图实现的目标。我可以想到很多情况下这会很有用,例如,当试图确定事件代码字符串是否属于某一类型的事件时。我的理解是,任何涉及ActionScript中反射的内容都会严重影响性能。如果是这样的话,我会小心地在经常使用的函数上实现这一点,因为性能比防弹代码更重要。他试图确定一个值是否等于类的常数。通过名称访问实例变量如何解决这个问题。。。好的,但是如果我有其他不是常量的公共字符串,如果设置为city应该抛出一个错误呢?@weltraumpirat你完全正确,我误解了这个问题。但是,如果将Strings值设置为它们的名称,那么这个解决方案就会起作用。例如,如果您有
const HALIFAX:String=“HALIFAX”
然后您可以询问
if(this[value]==undefined)
,它将给出所需的结果。应该注意的是,只有当常量值与常量名称完全相同时,这才有效。Ie:
public static const ENUM_ONE:String='ONE'将不起作用。