Maison  >  Article  >  développement back-end  >  C# utilise la réflexion pour implémenter une copie approfondie du partage d'exemples de code d'objet

C# utilise la réflexion pour implémenter une copie approfondie du partage d'exemples de code d'objet

黄舟
黄舟original
2017-03-29 11:29:531610parcourir

L'éditeur suivant vous proposera un article C# utilisant la réflexion pour implémenter la méthode de copie profonde de objet. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur pour y jeter un œil

Méthode d'implémentation

Copier des sous-objets d'un coup en les listant un par un est très laborieux- intensif.Si Si le sous-objet est un type référence , vous devez également vous demander s'il faut copier davantage le sous-objet.

Dans les applications réelles, si une classe possède des dizaines de sous-objets, les copier un par un est ennuyeux et prend du temps pour les développeurs.

Utilisez donc le mécanisme de réflexion pour y parvenir.

Mais s'il est exécuté sur le serveur, il est toujours recommandé de l'implémenter manuellement.

Après tout, le mécanisme de réflexion est plus lent que l'écriture directe.

Code :

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;
   }
 }

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