完成体式格局
经由过程挨个排列的体式格局一次复制子对象是异常消耗人力的,如果子对象是援用范例,则还要须要斟酌是不是对子对象进一步深拷贝。
现实运用中,一个类如果有几十个子对象,挨个复制关于开发人员来讲枯燥无味比较费时辛苦。
所以运用反射机制来完成。
然则如果是服务端运转的话,照样发起手动的完成。
毕竟反射机制比直接写出来的效力要慢一些。
代码:
public static class DeepCopyHelper { public static object Copy(this object obj) { Object targetDeepCopyObj; Type targetType = obj.GetType(); //值范例 if (targetType.IsValueType == true) { targetDeepCopyObj = obj; } //援用范例 else { targetDeepCopyObj = System.Activator.CreateInstance(targetType); //建立援用对象 System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers(); foreach (System.Reflection.MemberInfo member in memberCollection) { if (member.MemberType == System.Reflection.MemberTypes.Field) { System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member; Object fieldValue = field.GetValue(obj); if (fieldValue is ICloneable) { field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone()); } else { field.SetValue(targetDeepCopyObj, Copy(fieldValue)); } } else if (member.MemberType == System.Reflection.MemberTypes.Property) { System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member; MethodInfo info = myProperty.GetSetMethod(false); if (info != null) { object propertyValue = myProperty.GetValue(obj, null); if (propertyValue is ICloneable) { myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null); } else { myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue), null); } } } } } return targetDeepCopyObj; } }
以上就是C#运用反射来完成对象的深度复制的示例代码分享的细致内容,更多请关注ki4网别的相干文章!