2009-11-02 11 views
6

Si j'ai un enum marqué [Flags], existe-t-il un moyen de tester une valeur de ce type dans .NET pour voir s'il ne contient qu'une seule valeur? Je peux obtenir le résultat que je veux en utilisant le comptage de bits, mais je préfère utiliser des fonctions intégrées si possible.Test d'une valeur d'énumération [Flags] pour une seule valeur

Lors de la mise en boucle dynamique des valeurs enum, Enum.GetValues() renvoie également les indicateurs de combinaison. L'appel de cette fonction sur enum dans l'exemple suivant renvoie 4 valeurs. Cependant, je ne veux pas la valeur combinaisons inclus dans l'algorithme interne. Le test des valeurs enum individuelles pour l'égalité est désactivé, car le enum peut potentiellement contenir de nombreuses valeurs et nécessite également une maintenance supplémentaire lorsque les valeurs du enum changent.

[Flags] 
enum MyEnum 
{ 
    One = 1, 
    Two = 2, 
    Four = 4, 
    Seven = One | Two | Four, 
} 

void MyFunction() 
{ 
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum))) 
    { 
     if (!_HasSingleValue(enumValue)) continue; 

     // Guaranteed that enumValue is either One, Two, or Four 
    } 
} 

private bool _HasSingleValue(MyEnum value) 
{ 
    // ??? 
}



connexes: StackOverflow: Enum.IsDefined on combined flags

Répondre

14

Vous pouvez le jeter aux int et utiliser les techniques de Bit Twiddling Hacks pour vérifier si elle est une puissance de deux.

int v = (int)enumValue; 
return v != 0 && (v & (v - 1)) == 0; 
+0

+1. Bien que certainement pas la technique la plus transparente, c'est sans doute la plus simple. –

0

Vous pouvez utiliser une combinaison de IsDefined et la vérification des pouvoirs 2.

+0

Dans l'exemple que j'ai écrit, 'IsDefined' évaluerait toujours' true'. –

-1

Vous pourriez vous Enum.GetValues ​​et compter uniquement les éléments qui sont une puissance de 2 (divisible par 2 sans suite).