2010-10-13 65 views
5

我想打一个扩展方法来检查,如果枚举有一个标志。C#扩展方法如果枚举有一个标志设置

DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday; 
// instead of this: 
if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday) 
    ... 

// I want this: 
if (workDays.ContainsFlag(DaysOfWeek.Monday)) 
    ... 

我该如何做到这一点? (如果有已经这样做了,那么我会感激解释到这是如何编码的一类;!我已经太久太久,瞎搞用此方法)提前

感谢

+0

[C#中扩展枚举]的可能重复(http://stackoverflow.com/questions/1647634/extending-enum-in-c) – 2010-10-13 22:10:07

+0

这实际上帮助,感谢您的发现。 – Marlon 2010-10-13 22:18:45

回答

10

.NET 4已经包含了这个功能,如果可能的话,升级。

days.HasFlag(DaysOfWeek.Monday); 

如果这是不可能的升级,下面是该方法的实现:

public bool HasFlag(Enum flag) 
{ 
    if (!this.GetType().IsEquivalentTo(flag.GetType())) { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType())); 
    } 

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue()); 
    return ((uThis & uFlag) == uFlag); 
} 

你可以很容易地建立等效扩展方法:

public static bool HasFlag(this Enum @this, Enum flag) 
{ 
    // as above, but with '@this' substituted for 'this' 
} 
+0

不幸的是我无法升级。感谢你及时的答复 – Marlon 2010-10-13 22:18:19

0

我最近就遇到了这个问题。

如果您不知道Enum类型是什么,那么您可以将Enum转换为int类型,并使用Enum静态方法将Enum字段名称解析为值并使用op_BitwiseAnd比较值。

我会更新这个后面如果你有兴趣的代码,但现在我的标题出了门。