2013-06-26 2 views
0

У меня возникают проблемы с использованием перечисления в качестве флага.
Это описание:Как сделать несколько подмножеств в перечислении

enter image description here

Это мое перечисление:

[Flags] 
public enum AuthorityFlagsEnum : short 
{ 
    Output_1_enable = 1 << 0, 
    Output_2_enable = 1 << 1, 
    Output_3_enable = 1 << 2, 
    Output_4_enable = 1 << 3, 

    Arm_Disarm = 1 << 4, 
    Bypass_enable = 1 << 5, 
    Open_Close_report_enable = 1 << 6, 

    Arm_only = Output_2_enable, 
    Arm_only_during_close_window = Output_3_enable, 
    Master_Program = Output_4_enable, 
} 

Как я могу знать, в моем методе, если флаги установлены взяты из первого набора (руки только, мастер/программа) или со второго набора (выход 1 - 4)?

+0

Какова подпись вашего метода? Требуется ли несколько байтовых параметров? –

+0

Я думаю, у вас должно быть два разных набора перечислений. Один для тех случаев, когда «бит 7 ясен», а второй для «бит 7». В противном случае я не думаю, что можно магически познакомиться с другим. EDIT: Еще одна возможность - дать «Arm_only» и связанным значениям уникальное значение. Затем, когда вы читаете/записываете свои байты, преобразуйте его в правильное значение бит. –

ответ

2

Вы действительно не можете. В конце концов, enum - это просто целое число. Базовое значение enum будет только указанным вами номером. Класс Enum предоставляет функциональные возможности для преобразования целого числа в объект вашего типа enum и обратно, но он будет запутан, если у вас есть повторяющиеся номера.

Действительно единственный способ пойти в том, чтобы иметь несколько enum, если вам нужно различать значения.

+0

Хорошо, я пойду с множественным переходом. –

1

Согласно документации, которую вы предоставили, похоже, вам нужно посмотреть на бит 7. Я бы рекомендовал в том числе, что последний бит в вашем перечислении в качестве флага (а также изменить тип перечисления в байт), как это:

[Flags] 
public enum AuthorityFlagsEnum : byte 
{ 
    Output_1_enable = 1 << 0, 
    Output_2_enable = 1 << 1, 
    Output_3_enable = 1 << 2, 
    Output_4_enable = 1 << 3, 

    Arm_Disarm = 1 << 4, 
    Bypass_enable = 1 << 5, 
    Open_Close_report_enable = 1 << 6, 
    SecondSet = 1 << 7, // <--- Include a flag that indicates First/Second set 

    Arm_only = Output_2_enable, 
    Arm_only_during_close_window = Output_3_enable, 
    Master_Program = Output_4_enable, 
} 

Это позволит вам преобразовать байт непосредственно к значению перечисления, а также знать, является ли он первым или вторым набором:

byte byte3 = 2; //00000010 --> SecondSet is False (FirstSet) 
var authFlags = (AuthorityFlagsEnum)byte3; 
if (authFlags.HasFlag(AuthorityFlagsEnum.SecondSet)) 
{ 
    //Second set: bit 2 is Output_2_enable 
    if (authFlags.HasFlag(AuthorityFlagsEnum.Output_2_enable)) 
     //... 
} 
else 
{ 
    //First set: bit 2 is Arm_only 
    if (authFlags.HasFlag(AuthorityFlagsEnum.Arm_only)) 
     //... 
} 
Смежные вопросы