我想创建一个扩展方法来检查枚举是否有标志。
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 :(得分: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'
}
答案 1 :(得分:0)
我最近遇到了这个问题。
如果您不知道Enum的类型是什么,那么您可以将Enum转换为int并使用Enum静态方法将Enum字段名称解析为值并使用op_BitwiseAnd来比较值。 / p>
如果您有兴趣,我会稍后用代码更新,但现在我正在出门。