【问题标题】:C# extension method to check if an enumeration has a flag set用于检查枚举是否设置了标志的 C# 扩展方法
【发布时间】:2010-10-13 22:03:28
【问题描述】:

我想做一个扩展方法来检查枚举是否有标志。

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))
   ...

我怎样才能做到这一点? (如果有一个类已经这样做了,那么我将不胜感激解释如何编码;我已经把这个方法搞得太久了!)

提前感谢

【问题讨论】:

标签: c# generics enum-flags


【解决方案1】:

.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'
}

【讨论】:

  • 很遗憾,我无法升级。感谢您的快速回答
【解决方案2】:

我最近遇到了这个问题。

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

如果您有兴趣,我稍后会用代码更新此内容,但现在我要出门了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多