在ActionScript中动态投射

时间:2010-06-08 21:36:45

标签: flex flash actionscript-3 actionscript air

有没有办法在Actionscript中动态投射?我想要完成的事情由以下代码说明:

        var Val:*;
        var S:String=SomeTextEdit.text;
        switch (DesiredTypeTextEdit.text) {
          case 'int':Val=int(S);break; 
          case 'uint':Val=uint(S);break; 
          case 'String':Val=String(S);break; 
          case 'Number':Val=Number(S);break; 
          ...
        }
        SomeDisplayObject[SomePropertyNameTextEdit.text]=Val;

我正在寻找类似以下PSEUDOCODE的东西:

SomeDisplayObject[SomePropertyName]=eval(DesiredType)(SomeTextEdit.text);

是的,我已经意识到“eval”不在桌面上,也不是人们会如何使用它。

什么是正确的方式?

3 个答案:

答案 0 :(得分:1)

你必须玩try-catch游戏,但谷歌搜索其中的一些flash.utils有望成为你的终极手段:

getDefinitionByName(getQualifiedClassName(variable))

您可能必须将您打算使用的所有不同“类型”导入到某个项目中,但这应该可以帮助您入门。

答案 1 :(得分:1)

你可能正在寻找这样的东西:

http://benrimbey.wordpress.com/2009/06/20/reflection-based-json-validation-with-vo-structs/

检查“mapToFlexObjects”功能。他基本上是从文本中读取并在运行时分配类。

答案 2 :(得分:-1)

不确定你到底发生了什么(你的例子有点令人困惑),但我会尽力回答。

只有在创建变量时才能输入变量。您可以执行以下操作之一来更改变量的类型,但必须创建新类型的新变量。

var foo:Number = 230;
var foo2:int = foo as int;

var foo:Number = 230;
var foo2:int = int(foo);

如果您使用星号(*)作为变量类型,那么无论您将变量设置为什么,它都将成为该类型。试试这个作为测试:

var foo:* = new Sprite();
trace(foo); // Traces: "[object Sprite]"

这是一种不好的做法,也是糟糕的软件设计。但有时你必须做你必须做的事! How bad is dynamic casting?

相关问题