2009-06-24 7 views
15

quelqu'un peut-il me dire comment je peux identifier le type d'un objet en flexion? En particulier j'ai un tableau où je stocke plusieurs types dans (mais tous les UIComponents) maintenant que j'évalue le tableau que je veux savoir si j'ai un contrôle TextInput ou un RadioButton. Est-ce que quelqu'un a une idée?Obtenez le type en flex

Merci à l'avance

+0

juste fait avec "est": var b: Booléen = arr [i] est TextInput, est-ce le seul et le meilleur moyen de le faire? –

+0

ObjectUtil.getClassInfo ( – cloverink

Répondre

18

Vous pouvez tester contre une classe particulière en utilisant l'opérateur « est » ou vous pouvez utiliser flash.utils.getQualifiedClassName() (vous passez votre objet) - qui renvoie une chaîne de le nom de classe complet.

+0

Ah oui - getQualifiedClassName(). Il est utile plusieurs fois. –

1

L'opérateur is teste la compatibilité de type, oui. De la documentation, is:

... évalue si un objet est compatible avec un type de données spécifique, classe ou interface. Utilisez l'opérateur is au lieu de l'opérateur instanceof pour les comparaisons de type. Vous pouvez également utiliser l'opérateur is pour vérifier si un objet implémente une interface .

D'autres opérateurs utiles dans cette catégorie sont typeof (qui retourne une représentation de chaîne d'une primitive), instanceof (similaire à is, mais ne tient pas compte la compatibilité de l'interface) et as. Une liste complète et complète d'opérateurs ActionScript is available here.

J'espère que ça aide!

3

L'opérateur "est" représente une option.

Ensuite, il y a l'opérateur instanceof, qui pourrait ou non être utile selon la situation.

Il existe également la classe ObjectUtil avec la méthode statique getClassInfo. Celui-ci renvoie plus que juste le nom de classe de l'objet.

L'opérateur "typeof" est malheureusement inutile pour les classes.

Et, comme Branden Hall déjà suggéré, flash.utils.getQualifiedClassName().

2

Voici quelques pseudo-code simple qui montre comment utiliser l'opérateur is pour ce que vous voulez faire:

for each (var item:* in myArray) 
{ 
    if (item is TextInput) 
     doSomethingWithTextInput(item as TextInput); 
    else if (item is RadioButton) 
     doSomethingWithRadioButton(item as RadioButton); 
} 
+0

Vous pouvez utiliser Object au lieu de * sauf si vous attendez des espaces de noms et d'autres éléments fous dans votre tableau –

+0

Bon point, je En fait, si vous savez que vous allez avoir UIComponents ou DisplayObjects, alors vous pouvez l'utiliser. –

0

Votre meilleur pari utilise le « est » opérateur et utiliser quelque chose comme:

for(var i:int = 0; i < componentArr.length; i++) 
{ 
    var comp:UIComponent = componentArr[ i ]; 
    if(comp is DataGrid) 
     // Handle DataGrid functionality here. 
    else if (comp is DropDown) 
     // Handle DropDown here 
} 

Il existe cependant un problème avec cette approche. Parce que "est" retournera vrai pour toutes les classes descendantes, vous devez mettre toutes les classes descendantes avant leurs ancêtres - Liste doit venir avant ListBase. Cela peut causer des ennuis.

// This is important to remember: 
var mc:MovieClip = new MovieClip(); 
trace(mc is Sprite); // true 

Il y a une autre option pour les cas où vous souhaitez objets d'être membre d'une classe spécifique (et non une classe descendante): vous pouvez utiliser la propriété constructeur de l'objet et utiliser une instruction switch.

for(var i:int = 0; i < componentArr.length; i++) 
{ 
    var klass:Class = componentArr[ i ].constructor; 

    switch(klass) 
    { 
     case DataGrid: 
      // Handle DataGrid 
      break; 
     case Text: 
      // Handle Text 
      break; 
     case NumericStepper: 
      // Handle NumericStepper 
      break; 
     default: 
      // Handle default 
      break; 

    } 
} 
3

Essayez d'utiliser la propriété "className".

Il doit retourner "TextInput" ou "bouton" selon le cas

for each (var item:* in myArray) 
{ 
    if(item.hasProperty('className')) 
    { 
     trace("item ["+i+"] is :" + item['className']); 
    } 
} 
4

SON TRAVAIL :)

Ce qui suit est la façon dont je résolu cette question

switch(true) 
    { 
    case item is Customer_SF: 
    c = item as Customer_SF; 
    break; 

    case item is Opportunity: 
    o = item as Opportunity; 
    break; 

    case item is Product: 
    o = (item as Product)._opportunity; 
    break; 
    default: 
    return true; 
    } 
Questions connexes