L'acceptés (et actuellement les plus populaires de réponse) possède quelques défauts. La réponse pour ce cas d'utilisation spécifiques, mais les commentaires ont élargi la réponse à un semblant de solution générale.
Mais ce n'est pas une solution sûre, dans certains cas, et il ne traite pas de tous les objets possibles. L'idée que le XML n'est pas pris en charge a été adressée assez bien ici et d'ailleurs, mais le type-safe idée n'a pas.
L'hypothèse faite est que c'est un objet de classe créé par le programmeur. Ici sont quelques-uns des tests que j'ai mis en place (ce est en mode strict, mais un test local). Remarque l' int
résultats du test:
var sprite:Sprite = new Sprite();
var xml:XML = new XML();
var testInt:int = 2;
var testClass:TestClass = new TestClass();
var testAnon:Object = {};
trace("classname 1 = " + getQualifiedClassName(sprite));
trace("myclass 1 = " + getDefinitionByName(getQualifiedClassName(sprite)));
trace("constructor a 1 = " + Object(sprite).constructor);
trace("constructor a 1 = " + (Object(sprite).constructor as Class));
trace("constructor b 1 = " + sprite["constructor"]);
trace("constructor b 1 = " + (sprite["constructor"] as Class));
trace("...");
trace("classname 2 = " + getQualifiedClassName(xml));
trace("myclass 2 = " + getDefinitionByName(getQualifiedClassName(xml)));
trace("constructor a 2 = " + Object(xml).constructor);
trace("constructor a 2 = " + (Object(xml).constructor as Class));
trace("constructor b 2 = " + xml["constructor"]);
trace("constructor b 2 = " + (xml["constructor"] as Class));
trace("...");
trace("classname 3 = " + getQualifiedClassName(testInt));
trace("myclass 3 = " + getDefinitionByName(getQualifiedClassName(testInt)));
trace("constructor a 3 = " + Object(testInt).constructor);
trace("constructor a 3 = " + (Object(testInt).constructor as Class));
trace("constructor b 3 = " + testInt["constructor"]);
trace("constructor b 3 = " + (testInt["constructor"] as Class));
trace("...");
trace("classname 4 = " + getQualifiedClassName(testClass));
trace("myclass 4 = " + getDefinitionByName(getQualifiedClassName(testClass)));
trace("constructor a 4 = " + Object(testClass).constructor);
trace("constructor a 4 = " + (Object(testClass).constructor as Class));
trace("constructor b 4 = " + testClass["constructor"]);
trace("constructor b 4 = " + (testClass["constructor"] as Class));
trace("...");
trace("classname 5 = " + getQualifiedClassName(testAnon));
trace("myclass 5 = " + getDefinitionByName(getQualifiedClassName(testAnon)));
trace("constructor a 5 = " + Object(testAnon).constructor);
trace("constructor a 5 = " + (Object(testAnon).constructor as Class));
trace("constructor b 5 = " + testAnon["constructor"]);
trace("constructor b 5 = " + (testAnon["constructor"] as Class));
trace("...");
Avec TestClass
défini comme:
package
{
public class TestClass
{
}
}
Résultats:
classname 1 = flash.display::Sprite
myclass 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor b 1 = [class Sprite]
constructor b 1 = [class Sprite]
...
classname 2 = XML
myclass 2 = [class XML]
constructor a 2 =
constructor a 2 = null
constructor b 2 =
constructor b 2 = null
...
classname 3 = int
myclass 3 = [class int]
constructor a 3 = [class Number]
constructor a 3 = [class Number]
constructor b 3 = [class Number]
constructor b 3 = [class Number]
...
classname 4 = src::TestClass
myclass 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor b 4 = [class TestClass]
constructor b 4 = [class TestClass]
...
classname 5 = Object
myclass 5 = [class Object]
constructor a 5 = [class Object]
constructor a 5 = [class Object]
constructor b 5 = [class Object]
constructor b 5 = [class Object]
...
Au-delà de tout, les tests, il y a une assez bonne raison pour utiliser getDefinitionByName
sur le constructor
méthodes. L' getDefinitionByName
méthode permet de :
- Adobe pour développer des solutions internes pour l' (actuels et futurs) les zones problématiques
- vous n'auriez pas à modifier votre code pour l'avenir Adobe développements
- vous n'avez pas à développer deux (ou plus) pour séparer les méthodes de la dynamique de l'instanciation.
Il peut être plus lent maintenant, mais à l'avenir il peut y avoir des améliorations à partir d'Adobe côté qui permettrait de répondre à la question de vitesse.
(Par exemple, il a utilisé pour être que l' uint
a été beaucoup plus faible dans les boucles de int
, donc beaucoup de code de conversion a été configuré pour utiliser le plus rapide int
. C'était assez simple question à résoudre, afin d'Adobe fixe, et maintenant, il y a beaucoup de code qui saute à travers certains inutiles cerceaux pour obtenir de la vétusté de l'objectif.)
Depuis l' getDefinitionByName
méthode fonctionne correctement dans tous les cas, le code devrait être développé à l'aide de cette méthode, et ensuite travailler pour obtenir Adobe pour résoudre le problème de vitesse.