Heim  >  Artikel  >  Backend-Entwicklung  >  C# verwendet Reflektion, um eine tiefe Kopie der Objektbeispielcodefreigabe zu implementieren

C# verwendet Reflektion, um eine tiefe Kopie der Objektbeispielcodefreigabe zu implementieren

黄舟
黄舟Original
2017-03-29 11:29:531567Durchsuche

Der folgende Editor bringt Ihnen einen Artikel C#, der Reflektion verwendet, um die Deep-Copy-Methode von Objekt zu implementieren. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor, um einen Blick darauf zu werfen

Implementierungsmethode

Das gleichzeitige Kopieren von Unterobjekten durch Auflisten einzeln ist sehr arbeitsintensiv. intensiv. Wenn das Unterobjekt vom Typ Referenz ist, müssen Sie auch überlegen, ob Sie das Unterobjekt weiter kopieren möchten.

Wenn eine Klasse in tatsächlichen Anwendungen Dutzende von Unterobjekten hat, ist es für Entwickler langweilig und zeitaufwändig, diese einzeln zu kopieren.

Nutzen Sie also den Reflexionsmechanismus, um dies zu erreichen.

Wenn es jedoch auf dem Server ausgeführt wird, wird dennoch empfohlen, es manuell zu implementieren.

Schließlich ist der Reflexionsmechanismus langsamer als das direkte Schreiben.

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

Das obige ist der detaillierte Inhalt vonC# verwendet Reflektion, um eine tiefe Kopie der Objektbeispielcodefreigabe zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn