测试多个标志值

And*_*kle 2 c# enum-flags

我有这个标志枚举:

public enum AssignmentType
{
    None = 0,
    Attendant = 1,
    ConductorCBS = 2,
    ReaderCBS = 4,
    Chairman = 8,
    Mike = 16,
    PlatformAttendant = 32,
    Prayer = 64,
    OCLM = 128,
    Sound = 256,
    Student = 512,
    Custom = 1024,
    Demonstration = 2048,
    Assistant = 4096
}
Run Code Online (Sandbox Code Playgroud)

我现在想测试我的变量是否有特定的标志条件。

我想确定我的变量只是以下各项的任意组合

  • None
  • Student
  • Assistant
  • Demonstration

因此,如果它具有任何其他枚举值,则该变量将无法满足测试要求。

首先,我从这里开始:

bool bIsPersonnel = true;

if (_Assignments == AssignmentType.None ||
    _Assignments == AssignmentType.Demonstration || 
    _Assignments == AssignmentType.Student ||
    _Assignments == AssignmentType.Assistant ||
    _Assignments == (AssignmentType.Demonstration | AssignmentType.Student))
{
    bIsPersonnel = false;
}
Run Code Online (Sandbox Code Playgroud)

但是我很快意识到存在多种选择。

有没有更简单的方法?

我看不出建议的答案有什么帮助。我想反向进行测试是最容易的。只需测试它是否还有其他标志,那么我知道它是人员!

Jon*_*eet 6

您可以使用~按位求反运算符应用掩码以查找所有无效标志,并检查是否已应用任何标志。

var valid = AssignmentType.Student | AssignmentType.Assistant | AssignmentType.Demonstration;
var invalid = ~valid; // Everything that isn't valid

if ((_Assignments & invalid) != 0)
{
    // There was at least one invalid flag, handle it appropriately
}
Run Code Online (Sandbox Code Playgroud)

或检查它是否有效:

if ((_Assignment & invalid) == 0)
{
    // There are no invalid flags, handle it appropriately
}
Run Code Online (Sandbox Code Playgroud)

或者,如果只是在设置单个布尔标志之后,就根本不需要if声明:

bool isPersonnel = ((assignment & invalid) != 0);
Run Code Online (Sandbox Code Playgroud)

  • 我认为您需要分别检查`AssignmentType.None`状态,因为如果`_Assignments == AssignmentType.None`则`(_Assignments&invalid!= 0)`将为假(OP希望它为在那种情况下是正确的)。 (2认同)