EnumExt.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using AspectCore.Extensions.Reflection;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. using System.Reflection;
  7. namespace wms.util.Ext
  8. {
  9. public static class EnumExt
  10. {
  11. public static string GetDescription(this Enum obj)
  12. {
  13. var fi = obj.GetType().GetField(obj.ToString());
  14. var arrDesc = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
  15. return arrDesc[0]?.Description;
  16. }
  17. public static string GetDescription<T>(this Enum obj)
  18. {
  19. var refactor = typeof(T).GetField(obj.ToString()).GetReflector();
  20. var arrDesc = refactor.GetCustomAttributes(typeof(DescriptionAttribute));
  21. return ((DescriptionAttribute)arrDesc[0]).Description;
  22. }
  23. public static T ToEnum<T>(this string obj)
  24. {
  25. return (T)Enum.Parse(typeof(T), obj);
  26. }
  27. public static string GetDescription<T>(string obj)
  28. {
  29. var refactor = typeof(T).GetField(obj).GetReflector();
  30. var arrDesc = refactor.GetCustomAttributes(typeof(DescriptionAttribute));
  31. return ((DescriptionAttribute)arrDesc[0]).Description;
  32. }
  33. public static Dictionary<int, string> ToDict(this Enum obj)
  34. {
  35. var enumDict = new Dictionary<int, string>();
  36. foreach (int enumValue in Enum.GetValues(obj.GetType()))
  37. {
  38. enumDict.Add(enumValue, enumValue.ToString());
  39. }
  40. return enumDict;
  41. }
  42. public static List<string> ToList<T>()
  43. {
  44. //Type t = typeof(T);
  45. //var ty = t.GetFields(BindingFlags.Public | BindingFlags.Static)
  46. //.Where(p => t.IsAssignableFrom(p.FieldType))
  47. //.Select(pi => (T)pi.GetValue(null))
  48. //.ToList();
  49. return Enum.GetValues(typeof(T)).Cast<T>().Select(x => x.ToString()).ToList();
  50. }
  51. public static List<KeyValuePair<int, string>> ToKVList<T>()
  52. {
  53. var keys = new List<KeyValuePair<int, string>>();
  54. foreach (var e in Enum.GetValues(typeof(T)))
  55. {
  56. object[] objArr = e.GetType().GetField(e.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), true);
  57. DescriptionAttribute da = objArr?[0] as DescriptionAttribute;
  58. keys.Add(new KeyValuePair<int, string>(Convert.ToInt32(e), da.Description));
  59. }
  60. return keys;
  61. }
  62. public static List<KeyValuePair<int, string>> ToKVListLinq<T>()
  63. {
  64. Type t = typeof(T);
  65. return t.GetFields(BindingFlags.Public | BindingFlags.Static)
  66. .Where(p => t.IsAssignableFrom(p.FieldType))
  67. .Select(a => new KeyValuePair<int, string>(Convert.ToInt32(a.GetValue(null)),
  68. (a.GetCustomAttributes(typeof(DescriptionAttribute), true)?[0] as DescriptionAttribute).Description)
  69. ).ToList();
  70. }
  71. /// <summary>
  72. /// 根据指定的属性返回集合中的非重复元素
  73. /// </summary>
  74. /// <typeparam name="TSource">数据源的类型</typeparam>
  75. /// <typeparam name="TKey">数据源需要进行筛选的属性</typeparam>
  76. /// <param name="source">数据源</param>
  77. /// <param name="keySelector">指定属性的函数表达式</param>
  78. /// <returns></returns>
  79. public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
  80. {
  81. var seenKeys = new HashSet<TKey>();
  82. foreach (var source1 in source)
  83. {
  84. if (seenKeys.Add(keySelector(source1))) yield return source1;
  85. }
  86. }
  87. /// <summary>
  88. /// 两个参数任意一个不重复即可
  89. /// </summary>
  90. /// <typeparam name="TSource">数据源的类型</typeparam>
  91. /// <typeparam name="TKey1">数据源需要进行筛选的属性</typeparam>
  92. /// <typeparam name="TKey2">数据源需要进行筛选的属性</typeparam>
  93. /// <param name="source">数据源</param>
  94. /// <param name="keySelector1">指定属性的函数表达式</param>
  95. /// <param name="keySelector2">指定属性的函数表达式</param>
  96. /// <returns></returns>
  97. public static IEnumerable<TSource> DistinctBy<TSource, TKey1, TKey2>(this IEnumerable<TSource> source, Func<TSource, TKey1> keySelector1, Func<TSource, TKey2> keySelector2)
  98. {
  99. var seenKeys1 = new HashSet<TKey1>();
  100. var seenKeys2 = new HashSet<TKey2>();
  101. foreach (var source1 in source)
  102. {
  103. if (seenKeys1.Add(keySelector1(source1))) //第一属性不重复
  104. {
  105. seenKeys2.Add(keySelector2(source1)); //将第一属性对应的第二属性计入HashSet,避免第二属性重复
  106. yield return source1;
  107. }
  108. else if (seenKeys2.Add(keySelector2(source1))) yield return source1; //第一属性重复,第二属性不重复
  109. }
  110. }
  111. }
  112. }