EnumExtension.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System.Collections.Generic;
  2. using System.ComponentModel;
  3. using System.Reflection;
  4. namespace System
  5. {
  6. /// <summary>枚举类型助手类</summary>
  7. public static class EnumHelper
  8. {
  9. /// <summary>枚举变量是否包含指定标识</summary>
  10. public static bool Has(this Enum value, Enum flag)
  11. {
  12. if (value.GetType() != flag.GetType()) throw new ArgumentException("flag", "枚举标识判断必须是相同的类型!");
  13. ulong num = Convert.ToUInt64(flag);
  14. return (Convert.ToUInt64(value) & num) == num;
  15. }
  16. /// <summary>设置标识位</summary>
  17. public static T Set<T>(this Enum source, T flag, bool value)
  18. {
  19. if (!(source is T)) throw new ArgumentException("source", "枚举标识判断必须是相同的类型!");
  20. ulong s = Convert.ToUInt64(source);
  21. ulong f = Convert.ToUInt64(flag);
  22. if (value)
  23. {
  24. s |= f;
  25. }
  26. else
  27. {
  28. s &= ~f;
  29. }
  30. return (T)Enum.ToObject(typeof(T), s);
  31. }
  32. /// <summary>获取枚举字段的注释</summary>
  33. //public static string GetDescription(this Enum value)
  34. //{
  35. // var type = value.GetType();
  36. // var item = type.GetField(value.ToString(), BindingFlags.Public | BindingFlags.Static);
  37. // var att = item.GetCustomAttribute<DescriptionAttribute>(false);
  38. // if (att != null && !string.IsNullOrEmpty(att.Description)) return att.Description;
  39. // return null;
  40. //}
  41. ///// <summary>获取枚举类型的所有字段注释</summary>
  42. //public static Dictionary<TEnum, string> GetDescriptions<TEnum>()
  43. //{
  44. // var dic = new Dictionary<TEnum, string>();
  45. // foreach (var item in GetDescriptions(typeof(TEnum)))
  46. // {
  47. // dic.Add((TEnum)(object)item.Key, item.Value);
  48. // }
  49. // return dic;
  50. //}
  51. ///// <summary>获取枚举类型的所有字段注释</summary>
  52. //public static Dictionary<int, string> GetDescriptions(Type enumType)
  53. //{
  54. // var dic = new Dictionary<int, string>();
  55. // foreach (var item in enumType.GetFields(BindingFlags.Public | BindingFlags.Static))
  56. // {
  57. // if (!item.IsStatic) continue;
  58. // // 这里的快速访问方法会报错
  59. // //FieldInfoX fix = FieldInfoX.Create(item);
  60. // //PermissionFlags value = (PermissionFlags)fix.GetValue(null);
  61. // int value = Convert.ToInt32(item.GetValue(null));
  62. // string des = item.Name;
  63. // //var dna = AttributeX.GetCustomAttribute<DisplayNameAttribute>(item, false);
  64. // var dna = item.GetCustomAttribute<DisplayNameAttribute>(false);
  65. // if (dna != null && !string.IsNullOrEmpty(dna.DisplayName)) des = dna.DisplayName;
  66. // //var att = AttributeX.GetCustomAttribute<DescriptionAttribute>(item, false);
  67. // var att = item.GetCustomAttribute<DescriptionAttribute>(false);
  68. // if (att != null && !string.IsNullOrEmpty(att.Description)) des = att.Description;
  69. // //dic.Add(value, des);
  70. // // 有些枚举可能不同名称有相同的值
  71. // dic[value] = des;
  72. // }
  73. // return dic;
  74. //}
  75. }
  76. }