在多个条件下测试C#枚举标志
我有一个测试程序。我想使用带有标志的在多个条件下测试C#枚举标志,c#,enums,C#,Enums,我有一个测试程序。我想使用带有标志的enum来测试多个条件,但结果不正确 这是我的枚举: [Flags] enum CoverOptionTypes { MainLife = 0x0001, PolicyPayerMainLife = 0x0002, Spouse = 0x0004, Child = 0x0008, AdditionalChildren = 0xF } 当我创建枚举并赋值时,我似乎没有得到预期的值 如果我这样做 var option=Co
enum
来测试多个条件,但结果不正确
这是我的枚举:
[Flags]
enum CoverOptionTypes
{
MainLife = 0x0001,
PolicyPayerMainLife = 0x0002,
Spouse = 0x0004,
Child = 0x0008,
AdditionalChildren = 0xF
}
当我创建枚举并赋值时,我似乎没有得到预期的值
如果我这样做
var option=CoverOptionTypes.MainLife代码>
并使用以下各项进行测试:
if (option.HasFlag(CoverOptionTypes.MainLife)
{
Console.WriteLine("Main + PP Screen + Parents + Ext Family");
}
我得到了正确的输出。当我尝试以下多种场景时:
var option = CoverOptionTypes.MainLife;
option |= CoverOptionTypes.PolicyPayerMainLife;
option |= CoverOptionTypes.Child;
option |= CoverOptionTypes.AdditionalChildren;
if (option.HasFlag(CoverOptionTypes.MainLife) && (
option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
!option.HasFlag(CoverOptionTypes.Spouse) &&
!option.HasFlag(CoverOptionTypes.Child) &&
!option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
Console.WriteLine("Main + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) &&(
option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
option.HasFlag(CoverOptionTypes.Spouse) &&
!option.HasFlag(CoverOptionTypes.Child) &&
!option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
Console.WriteLine("Main + Spouse + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
option.HasFlag(CoverOptionTypes.Spouse) &&
option.HasFlag(CoverOptionTypes.Child) &&
!option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
Console.WriteLine("Main + Spouse + Child + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
option.HasFlag(CoverOptionTypes.Spouse) &&
option.HasFlag(CoverOptionTypes.Child) &&
option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
Console.WriteLine("Main + Spouse + Child + Additional Children + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
!option.HasFlag(CoverOptionTypes.Spouse) &&
option.HasFlag(CoverOptionTypes.Child) &&
!option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
Console.WriteLine("Main + Child + PP Screen + Parents + Ext Family");
}
else if (option.HasFlag(CoverOptionTypes.MainLife) && (
option.HasFlag(CoverOptionTypes.PolicyPayerMainLife) &&
!option.HasFlag(CoverOptionTypes.Spouse) &&
option.HasFlag(CoverOptionTypes.Child) &&
option.HasFlag(CoverOptionTypes.AdditionalChildren)))
{
Console.WriteLine("Main + Child + Additional Chidren + PP Screen + Parents + Ext Family");
}
我得到这个输出
Main + Spouse + Child + Additional Children + PP Screen + Parents + Ext Family
输出错误,因为我没有打开配偶
标志。当我调试时,我可以看到设置的标志,但是if决定进入了错误的if
语句。很确定这是因为您为枚举选择了整数值
考虑以下几点:
HasFlag
公式是(int)EnumValue&(int)TargetValue=(int)TargetValue
(来源:)
利用这个,我们可以看到
0xF&0x0004
返回0x0004
这基本上意味着当设置了AdditionalChildren
时,也设置了配偶
另外,您的MainLife
和PolicyPayerMainLife
具有相同的值。非常感谢您,在了解了HasFlag的工作原理后,我设法用二进制声明了我的常量,然后手动执行位操作进行测试,效果很好。让我把我是如何做到的作为一个答案