Maison  >  Article  >  développement back-end  >  Exemple de tutoriel sur la façon de cloner un objet

Exemple de tutoriel sur la façon de cloner un objet

零下一度
零下一度original
2017-06-24 09:55:281660parcourir

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.

Manuel

Le code est le suivant :

//手动复制
var user2 = new User
{
	Id = user1.Id,
	Name = new UserName 
	{
		FirstName= user1.Name.FirstName,
		LastName= user1.Name.LastName
	}
};

Réflexion

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 }
Afficher le code

Sérialisation

le code est le suivant :

1 //序列化2 var user4 = user1.DeepClone();

Méthode d'extension :

 1 /// 631fb227578dfffda61e1fa4d04b7d25 2 /// 深克隆 3 /// 先序列化再反序列化 4 /// 039f3e95db2a684c7b74365531eb6044 5 /// d65706098b2250eee2f48a758c9680c88ed7e392d75469626ca6a252f320a704 6 /// 9eeacba56bab5a25cf1fbc370b62c92f8bb7487ae6a16a43571bc14c7fcf93c2 7 /// 2363942ed0d6cd3e85bae1dffa568116f7735d9f6a7af371769ab5c16d23b2f3 8 public static T DeepClone8742468051c85b06f0a0af9e3e506b5c(this T obj) where T : class 9 {10     return obj != null ? obj.ToJson().FromJson8742468051c85b06f0a0af9e3e506b5c() : null;11 }
Afficher le code

D'autres utilisent des expressions.

Résumé :

  1. La copie manuelle a les meilleures performances, mais lorsque l'on rencontre des classes très complexes, la charge de travail est lourde.

  2. 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn