2014-02-06 5 views
0

У меня есть перечисление вроде следующего:Как добавить несколько перечислений в список объектов

public enum MyCategory 
{ 
    Automotive = 1, 
    BeautySalon = 2, 
    EventsEntertainment = 3, 
    and so on... 
} 

В моем главном классе у меня есть свойство, как так:

public List<MyCategory> Categories { get; set; } 

Мой бизнес объект может быть связан до 1 или многих из них в любое время. Я могу отобразить это перечисление перечисления в пользовательском интерфейсе, но мой вопрос в том, является ли хорошей практикой хранить несколько этих перечислений в списке <> как это, и если да, то какой был бы лучший способ приблизиться к этому?

+0

Я думаю, что я бы предпочел, чтобы сделать его флаги перечисления и объединить значение. – Magus

ответ

1

Вы должны воспользоваться FlagsAttribute:

[Flags] 
public enum MyCategory 
{ 
    Automotive = 1, 
    BeautySalon = 2, 
    EventsEntertainment = 4, 
    and so on... (each next item should have a value that it 2^n) 
} 

А потом:

MyCategory myCategory = MyCategory.Automotive ; 
myCategory |= MyCategory.BeautySalon ; 

Или в случае, если вы хотите присвоить несколько значений перечислений сразу:

MyCategory myCategory = (MyCategory.Automotive|MyCategory.BeautySalon); 

Затем я рекомендую использовать следующий вспомогательный метод для проверки:

public static bool ContainsMyCategory(MyCategory val, MyCategory checkedAgainst) 
{ 
    return ((val & checkedAgainst)==checkedAgainst); 
} 
+0

Вам также нужно использовать полномочия двух. – SLaks

+0

Что особенно круто, если вы используете левую смену! 'None = 0, Automotive = 1, BeautySalon = 1 << 1, EventsEntertainment = 1 << – Magus

+0

Спасибо, я новичок, но это очень помогает! – FrankO

0

Более предпочтительным способом является использование решения [Flags]. По сути, каждое значение в перечислении получает другой бит и установка или отсутствие этого бита указывает, присутствует ли это значение.

[Flags] 
public enum MyCategory 
{ 
    Automotive = 0x1; 
    BeautySalon = 0x2; 
    EventsEntertainment = 0x4, 
    and so on... 
} 

Свойства Categories бы тогда типа MyCategory и вы должны использовать битовые операции для проверки значений

if (0 != (obj.Categories & MyCategory.Automotive)) { 
    // The automotive category is set 
    ... 
} 
Смежные вопросы