Flags的按位或操作是在API设计中很常见的一种模式,十分直观和方便。C#中的枚举类型也提供了同样的机制来使用Flags模式。但是想要在代码中执行一些Flags操作需要频繁的使用按位或、按位与和按位求反等操作,十分不方便,代码可读性也不高。
最近在读CLR via C#讲述枚举类型的一章时,看到Jeff在书中为特定枚举类型实现了一组扩展方法来辅助枚举类型对Flags进行处理。
代码如下:
public static class MyEnumExtensions
{
public static Boolean IsSet(this MyEnum enumValue,
MyEnum valueToTest)
{
if (valueToTest == 0)
throw new ArgumentOutOfRangeException("valueToTest",
"Value must not be 0");
return (enumValue & valueToTest) == valueToTest;
}
public static Boolean IsClear(this MyEnum enumValue,
MyEnum valueToTest)
{
if (valueToTest == 0)
throw new ArgumentOutOfRangeException("valueToTest",
"Value must not be 0");
return !IsSet(enumValue, valueToTest);
}
public static Boolean AnyFlagsSet(this MyEnum enumValue,
MyEnum testValues)
{
return ((enumValue & testValues) != 0);
}
public static MyEnum Set(this MyEnum enumValue,
MyEnum setValues)
{
return enumValue | setValues;
}
public static MyEnum Clear(this MyEnum enumValue,
MyEnum clearValues)
{
return enumValue & ~clearValues;
}
public static void ForEach(this MyEnum enumValue,
Action<MyEnum> processValue)
{
if (processValue == null)
throw new Argu