EnumExtensions.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. public static class EnumExtensions
  6. {
  7. private static void CheckIsEnum<T>(bool withFlags)
  8. {
  9. if (!typeof(T).IsEnum)
  10. throw new ArgumentException(string.Format("Type '{0}' is not an enum", typeof(T).FullName));
  11. if (withFlags && !Attribute.IsDefined(typeof(T), typeof(FlagsAttribute)))
  12. throw new ArgumentException(string.Format("Type '{0}' doesn't have the 'Flags' attribute", typeof(T).FullName));
  13. }
  14. public static bool HasFlag<T>(this T value, T flag) where T : struct, IConvertible
  15. {
  16. CheckIsEnum<T>(true);
  17. long lValue = Convert.ToInt64(value);
  18. long lFlag = Convert.ToInt64(flag);
  19. return (lValue & lFlag) != 0;
  20. }
  21. public static IEnumerable<T> GetFlags<T>(this T value) where T : struct, IConvertible
  22. {
  23. CheckIsEnum<T>(true);
  24. foreach(T flag in Enum.GetValues(typeof(T)).Cast<T>())
  25. {
  26. if(value.HasFlag(flag))
  27. yield return flag;
  28. }
  29. }
  30. public static T SetFlags<T>(this T value, T flags, bool on) where T : struct, IConvertible
  31. {
  32. CheckIsEnum<T>(true);
  33. long lValue = Convert.ToInt64(value);
  34. long lFlag = Convert.ToInt64(flags);
  35. if (on)
  36. lValue |= lFlag;
  37. else
  38. lValue &= (~lFlag);
  39. return (T)Enum.ToObject(typeof(T), lValue);
  40. }
  41. public static T SetFlags<T>(this T value, T flags) where T : struct, IConvertible
  42. {
  43. return value.SetFlags(flags, true);
  44. }
  45. public static T ClearFlags<T>(this T value, T flags) where T : struct, IConvertible
  46. {
  47. return value.SetFlags(flags, false);
  48. }
  49. public static T CombineFlags<T>(this IEnumerable<T> flags) where T : struct, IConvertible
  50. {
  51. CheckIsEnum<T>(true);
  52. long lValue = 0;
  53. foreach (T flag in flags)
  54. {
  55. long lFlag = Convert.ToInt64(flag);
  56. lValue |= lFlag;
  57. }
  58. return (T)Enum.ToObject(typeof(T), lValue);
  59. }
  60. }