ホームページ  >  記事  >  バックエンド開発  >  C# はリフレクションを使用してオブジェクト サンプル コード共有のディープ コピーを実装します。

C# はリフレクションを使用してオブジェクト サンプル コード共有のディープ コピーを実装します。

黄舟
黄舟オリジナル
2017-03-29 11:29:531567ブラウズ

以下のエディターは、リフレクションを使用してオブジェクトのディープコピーメソッドを実装する記事C#を提供します。編集者はこれが非常に良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう

実装方法

サブオブジェクトが参照の場合、サブオブジェクトを1つずつリストして一括コピーするのは非常に手間がかかります。タイプの場合、それが正しいサブオブジェクトであるかどうかも考慮する必要があります。オブジェクトはさらに深くコピーされます。

実際のアプリケーションでは、クラスに数十のサブオブジェクトがある場合、開発者にとってそれらを 1 つずつコピーするのは退屈で時間がかかります。

そのため、それを実現するにはリフレクション メカニズムを使用します。

ただし、サーバー側で実行する場合でも、手動で実装することをお勧めします。

結局のところ、反映メカニズムは直接記述するよりも遅くなります。

コード:

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

以上がC# はリフレクションを使用してオブジェクト サンプル コード共有のディープ コピーを実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。