2009-07-30 11 views
3

J'essaie de parcourir chacun des membres d'un objet. Pour chaque membre, je vérifie pour voir si c'est une fonction ou pas. Si c'est une fonction, je veux en obtenir le nom et effectuer une logique basée sur le nom de la fonction. Je ne sais pas si c'est encore possible. Est-ce? Des conseils?Actionscript 3 introspection - noms de fonctions

exemple:

var mems: Object = getMemberNames(obj, true); 

for each(mem: Object in members) { 
    if(!(mem is Function)) 
     continue; 

    var func: Function = Function(mem); 

    //I want something like this: 
    if(func.getName().startsWith("xxxx")) { 
     func.call(...); 
    } 

} 

Je vais avoir du mal à trouver beaucoup à faire cela. Merci pour l'aide.

Répondre

4

Votre pseudocode est proche de faire ce que vous voulez. Au lieu d'utiliser getMemberNames, cependant, qui peut obtenir des méthodes privées, vous pouvez faire une boucle sur les membres avec une simple boucle for..in, et obtenir les valeurs des membres en utilisant des parenthèses. Par exemple:

public function callxxxxMethods(o:Object):void 
{ 
    for(var name:String in o) 
    { 
    if(!(o[name] is Function)) 
     continue; 
    if(name.startsWith("xxxx")) 
    { 
     o[name].call(...); 
    } 
    } 
} 
+1

Vous devez également éviter de mettre l'objet que vous vérifiez, que la coulée est très coûteux, en utilisant quelque chose comme « est » ou « comme » - comme cet exemple le fait , c'est beaucoup mieux. – quoo

+0

Corrigez-moi si je me trompe, mais je ne pense pas que vous pouvez lancer à la fonction. –

+0

@Tyler Egeto: Bien sûr que vous pouvez, vous ne pouvez pas l'appeler immédiatement si je crois, comme ça: Fonction (o [nom])(), vous devez le stocker: var foo: Fonction = Fonction (o [nom]) foo(); –

0

La réponse de Dan Monego est sur l'argent, mais ne fonctionne que pour les membres dynamiques. Pour tout membres exemple fixe (ou statique), vous devrez utiliser flash.utils.describeType:

var description:XML = describeType(obj); 

/* By using E4X, we can use a sort of lamdba like statement to find the members 
* that match our criteria. In this case, we make sure the name starts with "xxx". 
*/ 
var methodNames:XMLList = description..method.(@name.substr(0, 3) == "xxx"); 

for each (var method:XML in methodNames) 
{ 
    var callback:Function = obj[[email protected]]; 
    callback(); // For calling with an unknown set of parameters, use callback.apply 
} 

Utilisez cette option conjointement avec la réponse de Dan si vous avez un mélange de membres dynamiques et fixes.

0

J'ai fait un peu de travail et combiné les deux approches. Rappelez-vous, cela ne fonctionne que pour les membres visibles publiquement - dans tous les autres cas, null est retourné.

/** 
    * Returns the name of a function. The function must be <b>publicly</b> visible, 
    * otherwise nothing will be found and <code>null</code> returned.</br>Namespaces like 
    * <code>internal</code>, <code>protected</code>, <code>private</code>, etc. cannot 
    * be accessed by this method. 
    * 
    * @param f The function you want to get the name of. 
    * 
    * @return The name of the function or <code>null</code> if no match was found.</br> 
    *   In that case it is likely that the function is declared 
    *   in the <code>private</code> namespace. 
    **/ 
    public static function getFunctionName(f:Function):String 
    { 
     // get the object that contains the function (this of f) 
     var t:Object = getSavedThis(f); 

     // get all methods contained 
     var methods:XMLList = describeType(t)[email protected]; 

     for each (var m:String in methods) 
     { 
      // return the method name if the thisObject of f (t) 
      // has a property by that name 
      // that is not null (null = doesn't exist) and 
      // is strictly equal to the function we search the name of 
      if (t.hasOwnProperty(m) && t[m] != null && t[m] === f) return m;    
     } 
     // if we arrive here, we haven't found anything... 
     // maybe the function is declared in the private namespace? 
     return null;           
    } 

greetz,

tox

+1

qu'est-ce que getSavedThis (f)? –