如何在枚举中创建多个子集

时间:2013-06-26 09:53:51

标签: c# enums

我在使用枚举作为旗帜时遇到了麻烦 这是描述:

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

如果设置的标志来自第一组(仅限arm,主/程序)或第二组(输出1 - 4),我如何知道我的方法?

2 个答案:

答案 0 :(得分:2)

你真的不能。最后,enum只是一个非常整数。 enum的基础值只是您指定的数字。 Enum类提供了将整数转换为enum类型的对象的功能,然后返回,但是当您有重复的数字时,它会变得混乱。

如果您需要区分值,那么唯一的方法就是拥有多个enum

答案 1 :(得分: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))
        //...
}