ObjectHelper.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Reflection;
  3. using System.Linq;
  4. namespace MV485.helper
  5. {
  6. public class ObjectHelper
  7. {
  8. /// <summary>
  9. /// 将源对象的字段值复制到目标对象,复制字段名相同的部分。
  10. /// </summary>
  11. /// <typeparam name="TSource">源对象类型</typeparam>
  12. /// <typeparam name="TDestination">目标对象类型</typeparam>
  13. /// <param name="source">源对象</param>
  14. /// <param name="destination">目标对象</param>
  15. public static void CopyMatchingFields<TSource, TDestination>(TSource source, TDestination destination)
  16. {
  17. if (source == null || destination == null)
  18. throw new ArgumentNullException("Source or destination object cannot be null.");
  19. // 获取源和目标的属性
  20. var sourceProperties = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
  21. var destinationProperties = typeof(TDestination).GetProperties(BindingFlags.Public | BindingFlags.Instance);
  22. // 创建一个字典以快速查找目标属性
  23. var destinationPropertyMap = destinationProperties.ToDictionary(p => p.Name, p => p);
  24. foreach (var sourceProperty in sourceProperties)
  25. {
  26. if (destinationPropertyMap.TryGetValue(sourceProperty.Name, out var destinationProperty))
  27. {
  28. // 检查类型是否兼容以及目标属性是否可写
  29. if (destinationProperty.CanWrite &&
  30. destinationProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
  31. {
  32. var value = sourceProperty.GetValue(source);
  33. destinationProperty.SetValue(destination, value);
  34. }
  35. }
  36. }
  37. // 获取字段
  38. var sourceFields = typeof(TSource).GetFields(BindingFlags.Public | BindingFlags.Instance);
  39. var destinationFields = typeof(TDestination).GetFields(BindingFlags.Public | BindingFlags.Instance);
  40. // 创建一个字典以快速查找目标字段
  41. var destinationFieldMap = destinationFields.ToDictionary(f => f.Name, f => f);
  42. foreach (var sourceField in sourceFields)
  43. {
  44. if (destinationFieldMap.TryGetValue(sourceField.Name, out var destinationField))
  45. {
  46. // 检查类型是否兼容
  47. if (destinationField.FieldType.IsAssignableFrom(sourceField.FieldType))
  48. {
  49. var value = sourceField.GetValue(source);
  50. destinationField.SetValue(destination, value);
  51. }
  52. }
  53. }
  54. }
  55. //----------------------------------------------
  56. }
  57. }