2009-09-24 5 views
0

У меня есть Enum, предположит:Карта Enum в [Flags] Enum

public enum ItemStatus { 
    Available, Unavailable 
} 

У меня есть метод, который возвращает список тех телевизоров, на основе фильтра. А фильтр представлен в Enum:

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

Вопрос: что такое пятно способ проверить, если данный экземпляр ItemStatus спичек данный экземпляр ItemStatusFilter?

Мне не нравится идея присвоения значений элементам ItemStatus (1,2), поскольку это не требуется этим перечислением. Сейчас мой код выглядит следующим образом:

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; 
} 

Что-то в этом роде?

[Flags] 
public enum TagStatusFilter { 
    Available = 1 << TagStatus.Available, 
    Unavailable = 1 << TagStatus.Unavailable 
} 

Цель состоит в том, чтобы уменьшить количество кода и уменьшить сцепление между типами.

Ощущается ли это, что enum TagStatusFilter здесь не используется?

ответ

0

я не люблю его .. но это будет работать:

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

Это может вернуть ложные срабатывания, если имя элемента один перечисления также подстрока другого члена. –

+0

не в этом случае, поскольку первая буква перечисления капитализируется. Предостережение, очевидно, рекомендуется, и я говорю, что мне это не нравится .. но он определенно будет работать в этом случае :) – Sk93

-1

Если два перечислений отличаются только [Flag] атрибута, то вы можете использовать для фильтрации IEnumerable<ItemStatus> типа.

Так у вас есть веские причины, чтобы использовать два перечисления, то лучше фильтровать с

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

-1. Вы не поняли разницу между перечислениями флагов и регулярными перечислениями. – jgauffin

+0

В чем причина дублирования перечисления? – Artru

Смежные вопросы