我創建了一個簡單的擴展方法,該方法不需要檢查Enum
類型:
public static bool HasAnyFlag(this Enum value, Enum flags)
{
return
value != null && ((Convert.ToInt32(value) & Convert.ToInt32(flags)) != 0);
}
它也適用於可爲空的枚舉。標準的HasFlag
方法沒有,所以我創建了一個擴展來覆蓋它。
public static bool HasFlag(this Enum value, Enum flags)
{
int f = Convert.ToInt32(flags);
return
value != null && ((Convert.ToInt32(value) & f) == f);
}
一個簡單的測試:
[Flags]
enum Option
{
None = 0x00,
One = 0x01,
Two = 0x02,
Three = One | Two,
Four = 0x04
}
[TestMethod]
public void HasAnyFlag()
{
Option o1 = Option.One;
Assert.AreEqual(true, o1.HasAnyFlag(Option.Three));
Assert.AreEqual(false, o1.HasFlag(Option.Three));
o1 |= Option.Two;
Assert.AreEqual(true, o1.HasAnyFlag(Option.Three));
Assert.AreEqual(true, o1.HasFlag(Option.Three));
}
[TestMethod]
public void HasAnyFlag_NullableEnum()
{
Option? o1 = Option.One;
Assert.AreEqual(true, o1.HasAnyFlag(Option.Three));
Assert.AreEqual(false, o1.HasFlag(Option.Three));
o1 |= Option.Two;
Assert.AreEqual(true, o1.HasAnyFlag(Option.Three));
Assert.AreEqual(true, o1.HasFlag(Option.Three));
}
享受!
不應該全部讀取'All = A | B | C'? – stevehipwell 2009-08-27 09:56:22
AB | C相當於A | B | C因爲AB被定義爲A | B之前。 – 2009-08-27 10:00:14
@DanielBrückner - 它是相同的,但它的可讀性較差。特別是如果枚舉擴展。 – stevehipwell 2009-08-27 10:03:49