对象属性映射的高效实现

在编程过程中,经常需要将一个对象的属性值复制到另一个对象中。手动进行这项工作不仅繁琐,而且容易出错。本文将介绍一种使用C#反射实现对象属性映射的方法,只需一行代码即可完成。

这种方法的用途非常广泛,例如:当需要重新加载对象的先前状态而不影响其实例时,可以通过克隆它作为快照,然后在需要时复制属性值。或者,当从WCF或Web服务获取数据传输对象,并希望用这些数据填充特定对象时,这种方法同样适用。

虽然这不是解决问题的最高效方式,但它使用起来快速、易于理解,并且易于实现。

代码实现

代码的核心思想是使用反射来获取源对象的所有属性,然后检查目标对象是否存在相同名称的属性。如果存在,就将源对象的属性值复制到目标对象中。此外,还可以添加一个过滤器,用于排除在复制过程中需要忽略的属性。

如果有更多的时间,还可以添加一个字典,用于将源对象的属性名称映射到目标对象的另一个属性名称,即使它们的名称完全相同。

public static class PropertiesMapper { /// /// 将“from”对象的所有属性复制到当前对象,如果它们存在。 /// /// 要复制属性的目标对象 /// 用作源的对象 /// 从复制过程中排除这些属性 public static void CopyPropertiesFrom(this object to, object from, string[] excludedProperties) { Type targetType = to.GetType(); Type sourceType = from.GetType(); PropertyInfo[] sourceProps = sourceType.GetProperties(); foreach (var propInfo in sourceProps) { // 过滤属性 if (excludedProperties != null && excludedProperties.Contains(propInfo.Name)) continue; // 从目标获取匹配的属性 PropertyInfo toProp = (targetType == sourceType) ? propInfo : targetType.GetProperty(propInfo.Name); // 如果存在并且可写 if (toProp != null && toProp.CanWrite) { // 从源复制值到目标 Object value = propInfo.GetValue(from, null); toProp.SetValue(to, value, null); } } } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485