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'代码>将不起作用。