Как использовать атрибут Flags? - PullRequest
0 голосов
/ 05 июля 2011

У меня есть некоторые предметы в базе данных. Каждый из них может иметь много тегов, таких как Browsable, IsInMenu и так далее. Мой друг предложил использовать перечисления с атрибутом Flags для создания расширяемого решения. Итак, я создал поле в БД, которое принимает целочисленное значение, затем я создал это перечисление:

 [Flags]
 public enum ItemTags { Browsable = 2, IsInMenu = 4}

Теперь я хотел бы иметь возможность семантически получить список некоторых элементов следующим образом:

 public List<Item> GetItems(ItemTags tags)
 {
     /* 
     Code to get data from DB, something like, 
     return repository.GetList(tags);
     */
 }    

и в интерфейсе я хотел бы позвонить:

 List<Item> items =  GetItems(ItemTags.Browsable | ItemTags.IsInMneu);

Но я не получаю желаемого результата. Я иду правильным путем? Под желаемым результатом я имею в виду это: Значения, хранящиеся в базе данных, теперь могут быть одним из 0, 2, 4, 6 значений. 0 означает, что элемент не находится в Меню и не доступен для просмотра. 2 Означает, что элемент доступен для просмотра, но не в меню. 4 означает, что элемент находится в меню, но не доступен для просмотра. 6 означает, что элемент доступен для просмотра и IsInMenu. Теперь, когда я вызываю функцию GetItems, я не получаю все элементы, которые доступны для просмотра, в меню или одновременно доступны для просмотра и в меню.

Ответы [ 3 ]

2 голосов
/ 05 июля 2011

Вам нужно использовать FlagsAttribute, см. Эту статью MSDN , а также этот пример использования и, что наиболее важно, этот ответ о переполнении стека .

1 голос
/ 05 июля 2011

используйте FlagsAttribute Class

Указывает, что перечисление может быть рассматривается как битовое поле; то есть набор флагов.

[Flags] 
public enum ItemTags 
{ 
  Default =0,
  Browsable = 2, 
  IsInMenu = 4,
  All = 6 // Browsable / IsInMenu
}

Подробнее здесь

примечание о перечислениях:

Enum по умолчанию имеет int внизу, и как и все целые числа в C # перечисление имеет значение по умолчанию 0 когда впервые создан. Так что если 0 не отображается на константу перечисления тогда ваш enum будет создан с недействительным действительным

1 голос
/ 05 июля 2011

Вам не хватает атрибута Flags ...

Ваше перечисление должно быть объявлено так:

[Flags]
public enum ItemTags { Browsable = 2, IsInMenu = 4}

РЕДАКТИРОВАТЬ:
После вашего обновления выглядит нормально.Вы должны быть более точными в том, что имеете в виду:

Но я не получаю желаемого результата.

Код, который вы показали нам, выглядит хорошо.Так что либо есть проблема в другом месте, либо код, который вы действительно используете в своем приложении, и код, который вы показали нам здесь, отличаются.

...