EnumToEnumItemConverter.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. 
  2. ///////////////////////////////////////////////////////////////////////////////
  3. //Copyright (c) 2016, 北京探索者软件公司
  4. //All rights reserved.
  5. //文件名称: EnumToEnumItemConverter.cs
  6. //文件描述: 枚举向枚举条目对象转换
  7. //创 建 者: xls
  8. //创建日期: 2018-1-23
  9. //版 本 号:1.0.0.0
  10. ////////////////////////////////////////////////////////////////////////////////
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using System.Windows.Data;
  17. using FWindSoft.SystemExtensions;
  18. namespace FWindSoft.Wpf
  19. {
  20. public class EnumToEnumItemConverter : IValueConverter
  21. {
  22. public static EnumToEnumItemConverter Instance = new EnumToEnumItemConverter();
  23. public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  24. {
  25. Type sourceType = value.GetType();
  26. if (!sourceType.IsEnum)
  27. return value;
  28. var enumerable = parameter as IEnumerable<Object>;
  29. if (enumerable == null)
  30. return value;
  31. if (targetType.GetGenericTypeDefinition().FullName!=typeof (EnumItem<>).FullName)
  32. {
  33. return value;
  34. }
  35. var anyItem = enumerable.FirstOrDefault();
  36. if (anyItem == null)
  37. {
  38. return value;
  39. }
  40. var anyType = anyItem.GetType();
  41. if (!anyType.IsGenericType)
  42. {
  43. return value;
  44. }
  45. if (anyType.GetGenericArguments()[0] != sourceType)
  46. {
  47. return value;
  48. }
  49. var property=anyType.GetProperty("Item",
  50. System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
  51. if (property == null)
  52. {
  53. return value;
  54. }
  55. foreach (var o in enumerable)
  56. {
  57. if (
  58. System.Convert.ChangeType(property.GetValue(0), sourceType)
  59. .Equals(System.Convert.ChangeType(value, sourceType)))
  60. {
  61. return o;
  62. }
  63. }
  64. return value;
  65. }
  66. public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  67. {
  68. var anyType = value.GetType();
  69. if (!anyType.IsGenericType)
  70. {
  71. return value;
  72. }
  73. if (anyType.GetGenericArguments()[0] != targetType)
  74. {
  75. return value;
  76. }
  77. var property = anyType.GetProperty("Item",
  78. System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
  79. if (property == null)
  80. {
  81. return value;
  82. }
  83. return System.Convert.ChangeType(property.GetValue(value), targetType);
  84. }
  85. }
  86. }