Maison > développement back-end > Tutoriel C#.Net > Exemple de tutoriel sur la façon de cloner un objet

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

零下一度
Libérer: 2017-06-24 09:55:28
original
1717 Les gens l'ont consulté

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
	}
};
Copier après la connexion

Réflexion

Le code est comme suit :

1 //反射2 var user3 = user1.Copy() as User;
Copier après la connexion

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 }
Copier après la connexion
Afficher le code

Sérialisation

le code est le suivant :

1 //序列化2 var user4 = user1.DeepClone();
Copier après la connexion

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 }
Copier après la connexion
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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal