我在使用枚举作为旗帜时遇到了麻烦 这是描述:
这是我的枚举:
[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),我如何知道我的方法?
答案 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))
//...
}