C# 運用反射來完成對象的深度復制辦法。本站提示廣大學習愛好者:(C# 運用反射來完成對象的深度復制辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 運用反射來完成對象的深度復制辦法正文
完成方式
經過挨個羅列的方式一次復制子對象是十分消耗人力的,假如子對象是援用類型,則還要需求思索能否對子對象進一步深拷貝。
實踐使用中,一個類假如有幾十個子對象,挨個復制關於開發人員來說索然無味比擬費時費力。
所以運用反射機制來完成。
但是假如是服務端運轉的話,還是建議手動的完成。
畢竟反射機制比直接寫出來的效率要慢一些。
代碼:
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# 運用反射來完成對象的深度復制辦法就是分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。