3

可以说我有以下枚举:

[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.MobilePushpossibleUpdate?我必须针对每个标志进行测试possibleUpdatemyenums

我在 .NET 4.0 上使用 C#

4

4 回答 4

5
if (myenums & possibleUpdate != possibleUpdate)
    //not a possible update

要获得不需要的标志myenums

NotifyType missing = (~(myenums ^ wanted) ^ wanted) & (myenums | wanted);
于 2013-08-19T21:02:37.950 回答
4

在 .NET 4+ 中,您可以使用(当然,人们会抱怨它比手动操作慢 10 倍)您可以使用Enum.HasFlag,显然否定了结果。

于 2013-08-19T21:02:16.480 回答
4

无需弄清楚缺少哪一个,您只需要在bit-wise OR两者之间进行操作myenumspossibleUpdate然后将值重新分配。

//Does myenums contain all the flags in 'possibleUpdate'?  
if (myenums & possibleUpdate != possibleUpdate)
    //If not add the missing flags to myenums
    myenums = myenums | possibleUpdate;
于 2013-08-19T21:10:06.900 回答
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));
于 2013-08-19T21:34:13.050 回答