假设我有下面的枚举:
[Flags]
public enum NotifyType
{
None = 0,
Window = 1 << 0,
Sound = 1 << 1,
Flash = 1 << 2,
MobileSound = 1 << 3,
MobilePush = 1 << 4
}
考虑两个枚举:
var myenums = Window | Sound | Flash;
//var possibleUpdate = Window | MobilePush;
void UpdateMyEnums(NotifyType possibleUpdate)
{
//Does myenums contain all the flags in 'possibleUpdate'? If not add
//the missing flags to myenums
}
与myenums
相比,如何确定NotifyType.MobilePush
变量不包含possibleUpdate
值?我是否必须针对possibleUpdate
测试myenums
中的每个旗帜?
我在.NET 4.0上使用C#
答案 0 :(得分:4)
在.NET 4+中你可以使用(当然人们会说它比手动操作慢10倍)你可以使用Enum.HasFlag
,显然会否定结果。
答案 1 :(得分:4)
if (myenums & possibleUpdate != possibleUpdate)
//not a possible update
要获取所需的标记,而不是myenums
:
NotifyType missing = (~(myenums ^ wanted) ^ wanted) & (myenums | wanted);
答案 2 :(得分:4)
无需确定缺少哪一个,您只需在bit-wise OR
和myenums
之间执行possibleUpdate
,然后重新分配值。
//Does myenums contain all the flags in 'possibleUpdate'?
if (myenums & possibleUpdate != possibleUpdate)
//If not add the missing flags to myenums
myenums = myenums | possibleUpdate;
答案 3 :(得分:0)
显而易见的答案是简单地按位 - 或者需要的标志。如果你想要一系列缺失的标志,比如报告:
var missing = Enum.GetValues(typeof(NotifyType)).Cast<NotifyType>()
.Where(nt => ((nt & possibleUpdate) == nt)
&& ((nt & myenums) == 0));
Console.WriteLine("Missing: {0}", String.Join(" | ", missing));
您可以使用Enum.HasFlag
:
var missing = Enum.GetValues(typeof(NotifyType)).Cast<NotifyType>()
.Where(nt => possibleUpdate.HasFlag(nt)
&& !myenums.HasFlag(nt));