using System; using System.Reflection; using System.Linq; namespace MV485.helper { public class ObjectHelper { /// /// 将源对象的字段值复制到目标对象,复制字段名相同的部分。 /// /// 源对象类型 /// 目标对象类型 /// 源对象 /// 目标对象 public static void CopyMatchingFields(TSource source, TDestination destination) { if (source == null || destination == null) throw new ArgumentNullException("Source or destination object cannot be null."); // 获取源和目标的属性 var sourceProperties = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance); var destinationProperties = typeof(TDestination).GetProperties(BindingFlags.Public | BindingFlags.Instance); // 创建一个字典以快速查找目标属性 var destinationPropertyMap = destinationProperties.ToDictionary(p => p.Name, p => p); foreach (var sourceProperty in sourceProperties) { if (destinationPropertyMap.TryGetValue(sourceProperty.Name, out var destinationProperty)) { // 检查类型是否兼容以及目标属性是否可写 if (destinationProperty.CanWrite && destinationProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType)) { var value = sourceProperty.GetValue(source); destinationProperty.SetValue(destination, value); } } } // 获取字段 var sourceFields = typeof(TSource).GetFields(BindingFlags.Public | BindingFlags.Instance); var destinationFields = typeof(TDestination).GetFields(BindingFlags.Public | BindingFlags.Instance); // 创建一个字典以快速查找目标字段 var destinationFieldMap = destinationFields.ToDictionary(f => f.Name, f => f); foreach (var sourceField in sourceFields) { if (destinationFieldMap.TryGetValue(sourceField.Name, out var destinationField)) { // 检查类型是否兼容 if (destinationField.FieldType.IsAssignableFrom(sourceField.FieldType)) { var value = sourceField.GetValue(source); destinationField.SetValue(destination, value); } } } } //---------------------------------------------- } }