C# 枚举的常用位运算
本文旨在帮助开发者理解 C# 中常见的枚举位运算。
问题:
在枚举中进行位运算时,如何设置、清除、切换或测试单个位总是让人困惑。这些操作并不常用,所以很容易忘记。一份“位运算速查表”将非常有用。
示例:
<code class="language-csharp">flags = flags | FlagsEnum.Bit4; // 设置第 4 位。</code>
或者
<code class="language-csharp">if ((flags & FlagsEnum.Bit4) == FlagsEnum.Bit4) // 是否有更简洁的方法?</code>
你能为所有其他常见操作提供示例吗?最好使用 C# 语法和 [Flags]
枚举。
解答:
为了解决这个问题,一些开发者创建了扩展 System.Enum
的扩展方法,这些方法使用起来更方便。
<code class="language-csharp">namespace Enum.Extensions { public static class EnumerationExtensions { public static bool Has<T>(this System.Enum type, T value) { try { return (((int)(object)type & (int)(object)value) == (int)(object)value); } catch { return false; } } public static bool Is<T>(this System.Enum type, T value) { try { return (int)(object)type == (int)(object)value; } catch { return false; } } public static T Add<T>(this System.Enum type, T value) { try { return (T)(object)(((int)(object)type | (int)(object)value)); } catch (Exception ex) { throw new ArgumentException( string.Format( "无法将值添加到枚举类型 '{0}'。", typeof(T).Name ), ex); } } public static T Remove<T>(this System.Enum type, T value) { try { return (T)(object)(((int)(object)type & ~(int)(object)value)); } catch (Exception ex) { throw new ArgumentException( string.Format( "无法从枚举类型 '{0}' 中移除值。", typeof(T).Name ), ex); } } } }</code>
这些方法可以这样使用:
<code class="language-csharp">SomeType value = SomeType.Grapes; bool isGrapes = value.Is(SomeType.Grapes); // true bool hasGrapes = value.Has(SomeType.Grapes); // true value = value.Add(SomeType.Oranges); value = value.Add(SomeType.Apples); value = value.Remove(SomeType.Grapes); bool hasOranges = value.Has(SomeType.Oranges); // true bool isApples = value.Is(SomeType.Apples); // false bool hasGrapes = value.Has(SomeType.Grapes); // false</code>
以上是C# 按位枚举运算:简明备忘单?的详细内容。更多信息请关注PHP中文网其他相关文章!