Le clonage d'objets est souvent rencontré au cours du processus de développement. Parfois, un clonage superficiel est nécessaire, et parfois un clonage profond est nécessaire. Quelles sont les différences spécifiques entre eux et quelles sont les méthodes de mise en œuvre ?
Il existe plusieurs méthodes pour mettre en œuvre le clonage profond.
Le code est le suivant :
//手动复制 var user2 = new User { Id = user1.Id, Name = new UserName { FirstName= user1.Name.FirstName, LastName= user1.Name.LastName } };
Le code est comme suit :
1 //反射2 var user3 = user1.Copy() as User;
Méthode d'extension :
1 public static class DeepCopyHelper 2 { 3 public static object Copy(this object obj) 4 { 5 Object targetDeepCopyObj; 6 Type targetType = obj.GetType(); 7 //值类型 8 if (targetType.IsValueType == true) 9 {10 targetDeepCopyObj = obj;11 }12 //引用类型 13 else14 {15 targetDeepCopyObj = System.Activator.CreateInstance(targetType); //创建引用对象 16 System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers();17 18 foreach (System.Reflection.MemberInfo member in memberCollection)19 {20 if (member.MemberType == System.Reflection.MemberTypes.Field)21 {22 System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member;23 Object fieldValue = field.GetValue(obj);24 if (fieldValue is ICloneable)25 {26 field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone());27 }28 else29 {30 field.SetValue(targetDeepCopyObj, Copy(fieldValue));31 }32 33 }34 else if (member.MemberType == System.Reflection.MemberTypes.Property)35 {36 System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member;37 MethodInfo info = myProperty.GetSetMethod(false);38 if (info != null)39 {40 object propertyValue = myProperty.GetValue(obj, null);41 if (propertyValue is ICloneable)42 {43 myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null);44 }45 else46 {47 myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue), null);48 }49 }50 51 }52 }53 }54 return targetDeepCopyObj;55 }56 }
le code est le suivant :
1 //序列化2 var user4 = user1.DeepClone();
Méthode d'extension :
1 /// <summary> 2 /// 深克隆 3 /// 先序列化再反序列化 4 /// </summary> 5 /// <typeparam name="T"></typeparam> 6 /// <param name="obj"></param> 7 /// <returns></returns> 8 public static T DeepClone<T>(this T obj) where T : class 9 {10 return obj != null ? obj.ToJson().FromJson<T>() : null;11 }
D'autres utilisent des expressions.
Résumé :
La copie manuelle a les meilleures performances, mais lorsque l'on rencontre des classes très complexes, la charge de travail est lourde.
Par rapport à la réflexion et à la sérialisation, la sérialisation est plus simple.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!