2009-09-24 13 views
0

J'ai un Enum, supposons que:Carte Enum [Flags] Enum

public enum ItemStatus { 
    Available, Unavailable 
} 

J'ai une méthode qui retourne une liste de ces téléviseurs, basée sur un filtre. Et un filtre est représenté par un Enum:

[Flags] 
public enum ItemStatusFilter { 
    Available = 1, Unavailable = 2 
} 

Question: Quelle est une façon habile pour vérifier si par exemple donné des ItemStatus matches de donné instance de ItemStatusFilter?

Je n'aime pas l'idée d'assigner des valeurs aux membres ItemStatus (1,2) car elle n'est pas requise par cette énumération. À l'heure actuelle, mon code se présente comme suit:

public static bool Matches(this TagStatusFilter statusFilter, TagStatus status) { 
    if (status == TagStatus.Available && ((statusFilter & TagStatusFilter.Available) != 0)) return true; 
    if (status == TagStatus.Unavailable && ((statusFilter & TagStatusFilter.Unavailable) != 0)) return true; 
    return false; 
} 

Qu'en est-il de quelque chose dans ce sens? Le but est de réduire la quantité de code et de réduire le couplage entre les types.

Est-ce que c'est comme si enum TagStatusFilter était mal utilisé ici?

Répondre

0

je ne l'aime pas .. mais ça va marcher:

 foreach (tv t in tvs) 
     { 
      if (isf.ToString().Contains(t.Status.ToString())) 
      { 
       //match 
       Console.WriteLine("matched"); 
      } 
     } 
+0

Cela peut retourner les faux positifs si l'un nom de membre de ENUM est également une sous-chaîne d'un autre membre. –

+0

pas dans ce cas, car la première lettre de l'enum est en majuscule. La prudence est évidemment conseillée, et je dis que je ne l'aime pas .. mais il va certainement travailler dans cet exemple :) – Sk93

-1

Si deux énumérations ne diffère que dans l'attribut [Flag], vous pouvez utiliser pour filtrer le type IEnumerable<ItemStatus>.

Vous avez donc de bonnes raisons d'utiliser deux énumérations alors mieux filtrer avec

public bool Matches(ItemStatusFilter statusFilter, ItemStatus status) 
{ 
    return ((int)statusFilter & (int)status) > 0; 
} 
+0

-1. Vous n'avez pas compris la différence entre les drapeaux enums et les enums réguliers. – jgauffin

+0

Quelle est la raison de la duplication enum? – Artru