Lorsque vous utilisez énumérations avec des champs de bits:Existe-t-il un autre moyen de tester les champs de bits Enum?
enum ReallyBigEnum { FirstChoice = 0x01, AnotherOption = 0x02 }
ReallyBigEnum flag = ReallyBigEnum.FirstChoice | ReallyBigEnum.AnotherOption;
le code utilisé pour tester les bits est:
if((flag & ReallyBigEnum.AnotherOption) == ReallyBigEnum.AnotherOption) { ... }
qui semble bavard et sujette aux erreurs en raison de la nécessité de répéter le bit testé.
Ce serait bien s'il y avait une façon de dire:
if(flag.IsSet(ReallyBigEnum.AnotherOption)) { ... }
mais énumérations ne prennent pas en charge les méthodes d'instance. Donc, j'ai essayé une fonction de modèle:
class Enums
{
public static bool IsSet<T>(T flag, T bit) { return (flag & bit) == bit; }
}
mais le code pour tester les bits ressemble alors à ceci:
if(Enums.IsSet<ReallyBigEnum>(flag, ReallyBigEnum.AnotherOption)) { ... }
ce qui est beaucoup à écrire. Ensuite, j'ai essayé de le raccourcir:
class Enums
{
public static bool IsSet(int flag, int bit) { return (flag & bit) == bit; }
}
mais vous devez jeter chaque valeur à son type de base comme celui-ci:
if(Enums.IsSet((int)flag, (int)ReallyBigEnum.AnotherOption)) { ... }
qui est aussi une douleur au code et perd le bénéfice de la vérification du type .
La même fonction peut être écrite pour utiliser les paramètres 'objet', mais le type d'objet et le type de base sous-jacent doivent être testés. Donc, je suis coincé avec le standard, de manière redondante en haut.
Est-ce que quelqu'un a d'autres idées sur une façon propre et simple de tester les champs de bits Enum?
Merci beaucoup.
La méthode hasFlag() est la solution parfaite, bien sûr. Merci! Malheureusement, notre environnement de développement utilise toujours .NET 2.0. –