EnumerableCopier.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. namespace Masuit.Tools.Mapping
  5. {
  6. /// <summary>
  7. /// 可遍历类型拷贝器
  8. /// </summary>
  9. internal class EnumerableCopier
  10. {
  11. private static readonly MethodInfo _copyArrayMethodInfo;
  12. private static readonly MethodInfo _copyICollectionMethodInfo;
  13. private static readonly Type _typeICollection = typeof(ICollection<>);
  14. static EnumerableCopier()
  15. {
  16. Type type = typeof(EnumerableCopier);
  17. _copyArrayMethodInfo = type.GetMethod(nameof(CopyArray));
  18. _copyICollectionMethodInfo = type.GetMethod(nameof(CopyICollection));
  19. }
  20. /// <summary>
  21. /// 根据IEnumerable的实现类类型选择合适的拷贝方法
  22. /// </summary>
  23. /// <param name="type">IEnumerable的实现类类型</param>
  24. /// <returns>拷贝方法信息</returns>
  25. public static MethodInfo GetMethondInfo(Type type)
  26. {
  27. if (type.IsArray)
  28. {
  29. return _copyArrayMethodInfo.MakeGenericMethod(type.GetElementType());
  30. }
  31. if (type.GetGenericArguments().Length > 0)
  32. {
  33. Type elementType = type.GetGenericArguments()[0];
  34. if (_typeICollection.MakeGenericType(elementType).IsAssignableFrom(type))
  35. {
  36. return _copyICollectionMethodInfo.MakeGenericMethod(type, elementType);
  37. }
  38. }
  39. throw new UnsupportedTypeException(type);
  40. }
  41. /// <summary>
  42. /// 拷贝List
  43. /// </summary>
  44. /// <typeparam name="T">源ICollection实现类类型</typeparam>
  45. /// <typeparam name="TElement">源ICollection元素类型</typeparam>
  46. /// <param name="source">源ICollection对象</param>
  47. /// <returns>深拷贝完成的ICollection对象</returns>
  48. public static T CopyICollection<T, TElement>(T source) where T : ICollection<TElement> where TElement : class
  49. {
  50. T result = (T)MapperTools.CreateNewInstance(source.GetType());
  51. if (MapperTools.IsRefTypeExceptString(typeof(TElement)))
  52. {
  53. foreach (TElement item in source)
  54. {
  55. result.Add(ExpressionGenericMapper<TElement, TElement>.Copy(item));
  56. }
  57. }
  58. else
  59. {
  60. foreach (TElement item in source)
  61. {
  62. result.Add(item);
  63. }
  64. }
  65. return result;
  66. }
  67. /// <summary>
  68. /// 拷贝数组
  69. /// </summary>
  70. /// <typeparam name="TElement">源数组元素类型</typeparam>
  71. /// <param name="source">源List</param>
  72. /// <returns>深拷贝完成的数组</returns>
  73. public static TElement[] CopyArray<TElement>(TElement[] source) where TElement : class
  74. {
  75. TElement[] result = new TElement[source.Length];
  76. if (MapperTools.IsRefTypeExceptString(typeof(TElement)))
  77. {
  78. for (int i = 0; i < source.Length; i++)
  79. {
  80. result[i] = ExpressionGenericMapper<TElement, TElement>.Copy(source[i]);
  81. }
  82. }
  83. else
  84. {
  85. for (int i = 0; i < source.Length; i++)
  86. {
  87. result[i] = source[i];
  88. }
  89. }
  90. return result;
  91. }
  92. }
  93. }