2011-10-02 3 views
1

Possible en double:
Iterating through an enumeration in Silverlight?Comment passer Enum comme argument

je suis venu avec une petite fonction pratique qui me fait le compte d'un ENUM (je sais que ce ne sera pas travailler correctement avec tous les enums). Plutôt que de coder en dur l'Enum dans la fonction de sorte que je doive écrire une fonction seprate pour chaque Enum avec laquelle je veux l'utiliser, je voulais passer l'enum comme argument mais j'ai de la difficulté à trouver comment le faire.

Voici le code:

private enum MyColors { Red, Green, Blue } 

    private Int32 GetEnumCount() 
    { 
     Int32 i = 0; 
     while (Enum.IsDefined(typeof(MyColors), (MyColors)i)) 
     { 
      i++; 
     } 
     return i; 
    } 

MISE À JOUR

je suis venu avec ce que la réponse à la fin:

private Int32 GetEnumCount(Type enumType) 
    { 
     Int32 i = 0; 
     while (Enum.IsDefined(enumType, i)) 
     { 
      i++; 
     } 
     return i; 
    } 
+0

Btw, la deuxième réponse la plus élevée sur cette page est celle que je recommande. – Noldorin

+0

Cette approche ne fonctionnerait que lorsque les valeurs enum sont contiguës. Un enum attribué 'Flags 'aurait typiquement des trous dans les entiers utilisés, donc cette approche échouerait. Peut-être pourriez-vous expliquer pourquoi vous en avez besoin? – AnthonyWJones

Répondre

0

Vous devez prendre l'ENUM Type comme un argument et supprimez la distribution à (MyColors).

En non-Sliverlight, vous pouvez également remplacer simplement votre fonction avec

Enum.GetValues(typeof(MyEnum)).Length 
+2

-1 pour copier ma réponse dans votre édition! – Noldorin

+0

@Noldorin: J'ai écrit cette réponse avant vous, et j'ai écrit la modification avant que j'ai vu votre réponse. – SLaks

+0

Non, ce n'est pas le cas Lorsque j'ai posté ma réponse, votre bit 'Enum.GetValues' n'était * pas * inclus. Je me suis rafraîchi 30 secondes plus tard et c'était le cas. Vous avez même appelé votre type enum exactement la même chose ... – Noldorin

1

Cela peut être fait, mais il y a un peu de travail supplémentaire nécessaire pour le faire fonctionner avec énumérations unusal:

private static ulong GetEnumContiguousCount(Type enumType) 
{ 
    var underlyingType = Enum.GetUnderlyingType(enumType); 
    ulong i; 
    for (i = 0; Enum.IsDefined(enumType, Convert.ChangeType(i, underlyingType, null)); ++i) {} 
    return i; 
} 

Démo: http://ideone.com/Serji

+0

+1: La nécessité de gérer un type sous-jacent différent est logique, mais retourner 'ulong' ne l'est pas,' int' le ferait et serait plus facile à utiliser. – AnthonyWJones

+0

@AnthonyWJones: Vous avez probablement raison, mais je n'ai pas à la fois chercher le nombre maximum de membres d'une énumération. –

2

En alternative (bien que cela ait déjà été répondu) si vous démarrez le premier avec 0 alors ajoutez-en un à la fin appelé count puis vous pouvez l'utiliser, par exemple:

enum MyColour 
{ 
    Blue = 0, 
    Red, 
    Green, 
    ColourCount 
} 
+0

c'est un utile à garder à l'esprit – descf

Questions connexes