虽然Bassam 的回答提供了一些关于如何解决问题的很好的一般信息,但它并没有将问题与现实解决方案之间的点点滴滴联系起来。
[Flags]
这是一个使用枚举、常量(保存要与之相交的值)和扩展方法指定的位操作的实现演示。
标志枚举
[Flags]
public enum ObjType
{
One = 0x01,
X = 0x02,
Two = 0x04,
Y = 0x08,
Three = 0x10,
Z = 0x20
}
扩展方法
public static class ObjTypeExtensions
{
public static readonly ObjType Exceptions = ObjType.X | ObjType.Y | ObjType.Z;
public static ObjType IntersectWith(this ObjType objType, ObjType value)
{
return objType & value;
}
public static bool Any(this ObjType objType, ObjType value)
{
return (objType & value) != 0;
}
}
用法
var test1 = ObjType.One | ObjType.Three | ObjType.X;
var result1 = test1.IntersectWith(ObjTypeExtensions.Exceptions);
// result1 == ObjType.X
var test2 = ObjType.Two | ObjType.Y | ObjType.Z;
var result2 = test2.IntersectWith(ObjTypeExtensions.Exceptions);
// result2 == ObjType.Y | ObjType.Z
要测试是否有任何相交值,只需调用 Any() 方法即可得到答案。
bool any2 = test2.Any(ObjTypeExtensions.Exceptions);
// any2 == true
var test3 = ObjType.One | ObjType.Three;
bool any3 = test3.Any(ObjTypeExtensions.Exceptions);
// any3 == false