这项任务非常简单:我需要动态地使用 new 关键字初始化变量,具体取决于它的类型。例如:
public var object:Sprite;
...
object = new Sprite();
在这种情况下,类型是 Sprite ,但它可以是任何东西,并且实际使用 new 实例化它的方法,不知道它的声明类型。当然我可以在字符串变量中存储类型(或类名)并用它实例化对象。但我只是想知道我是否可以从对象本身获取该类型信息,因为它在类中声明并且在逻辑上认为它的类型信息可能存储在某处并且可以检索。
答案 0 :(得分:4)
是的,您可以,但变量必须是公共的(或具有访问器方法),并且您需要将其名称作为字符串:
使用describeType()获取类的XML描述,然后将访问器和变量作为XMLList获取,迭代直到找到变量的名称,并通过调用getDefinitionByName()获取类。这是一个例子:
var className : String = "";
var type:XML = describeType (this);
var variables:XMLList = type..variable;
for each (var variable:XML in variables) {
if (variable.@name == myVariableName) {
className = variable.@type;
break;
}
}
if (className == "") {
var accessors:XMLList = type..accessor;
for each (var accessor:XML in accessors) {
if (accessor.@name == myVariableName) {
className = accessor.@type;
break;
}
}
}
if (className=="") {
trace ("no such variable");
return;
}
var ClassReference : Class = getDefinitionByName( className.replace ("::", ".") ) as Class;
myVariable = new ClassReference( );
答案 1 :(得分:0)
我无法弄清楚如何“回复”答案,否则我会将其添加到当前的答案中。
如果您拥有该对象的已知类型列表,则可以使用typeof对这些类型进行测试。
switch(typeof unknownVar)
{
case typeof Function:
unknownVar = new Function();
break;
case typeof String:
unknownVar = "Bruce Lee";
break;
case typeof Number:
unknownVar = 3.14;
break;
default:
trace(typeof unknownVar); // This is not normally helpful...
}
答案 2 :(得分:-1)
简而言之,您无法获得未初始化变量的类型。
听起来这是一种工厂模式实现。最好的办法是将类的引用传递给方法
方法:
public function create(class:Class) : void
{
return new class();
}
调用代码:
public var object:Sprite;
...
object = createObject(Sprite)