c#标志比较“仅包含”一组

时间:2016-08-18 23:32:18

标签: c# enums

[ Flags ]
public enum StatusType { a,b,c,d,e,f,g }

StatusType m_StatusType = a | b;

If ( m_StatusType only contains a and b )  // I need help here
{ 

}

您好,

我需要一些比较标志的帮助。如何知道标志枚举变量是否只包含某些特定值?

2 个答案:

答案 0 :(得分:1)

首先,在定义标志枚举时,每个标志应代表枚举中的一个位:

enum X { a = 1, b = 2, c = 4, d = 8 }

这允许您组合标志:

CandD = 12, //has both c and d flags set.

或者如果你有很多:

enum X { 
  a = 1 << 0, 
  b = 1 << 1, 
  c = 1 << 2, 
  d = 1 << 3,
  ...
  CAndD = c | d
}

您可以使用简单的相等比较来测试是否只设置了某些标志。

public bool ContainsOnly(X value, X flags) 
{
     return value == flags;
}

public bool ContainsOnlyCandD(X value) 
{
     return value == (X.c | X.d);
}

public bool ContainsBothCandDButCouldContainOtherStuffAsWell(X value) 
{
     return (value & (X.c | X.d)) == (X.c | X.d);
}

答案 1 :(得分:1)

首先,你的标志应该这样创建:

[Flags]
public enum StatusType
{
    None = 0
    A = 1,
    B = 2,
    C = 4,
    D = 8,
    E = 16,
    F = 32,
    G = 64
}

然后您可以这样分配:

var statusType = StatusType.A | StatusType.B;

然后测试它:

if (statusType.HasFlag(StatusType.A))
{
    //A is defined
}