0

我在使用枚举作为标志时遇到了麻烦。
这是描述:

在此处输入图像描述

这是我的枚举:

[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)?

4

2 回答 2

2

你真的不能。最后,enum只是一个漂亮的整数。的基础值enum将只是您指定的数字。该类Enum提供了将整数转换为您的enum类型的对象并返回的功能,但是当您有重复的数字时它会感到困惑。

enum如果您需要区分这些值,那么真正唯一的方法是拥有多个's。

于 2013-06-26T10:16:10.327 回答
1

根据您提供的文档,您似乎需要查看bit 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))
        //...
}
于 2013-06-26T10:30:41.757 回答