2011-10-14 7 views
5

参照なしでクラスオブジェクトのコピーを作成するにはどうすればよいですか? ICloneableは、(浅いコピーを介して)クラスオブジェクトのコピーを作成しますが、ディープコピーはサポートしません。私は、クラスオブジェクトのすべてのメンバーを読み込み、メンバ名を指定せずに別のオブジェクトに深くコピーするのに十分なスマートな関数を探しています。リファレンスなしでクラスオブジェクトのコピーを作成する方法は?

+2

可能重複(http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos

+1

迅速かつ汚い解決策は、オブジェクトをシリアライズし、直ちに別のオブジェクトにデシリアライズすることです。もちろん、オブジェクトが適切にシリアル化できるかどうかによって異なります... – canon

答えて

4

私は基本的にあなたがICloneableが、私はこのスレッドを参照しています深いコピー

public static T DeepCopy(T other) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.Serialize(ms, other); 
     ms.Position = 0; 
     return (T)formatter.Deserialize(ms); 
    } 
} 

をしていないについて言ったので、これを行うには、独自の関数を記述し、解決策として、これを見てきました。 copy a class, C#

0
public static object Clone(object obj) 
    { 
     object new_obj = Activator.CreateInstance(obj.GetType()); 
     foreach (PropertyInfo pi in obj.GetType().GetProperties()) 
     { 
      if (pi.CanRead && pi.CanWrite && pi.PropertyType.IsSerializable) 
      { 
       pi.SetValue(new_obj, pi.GetValue(obj, null), null); 
      } 
     } 
     return new_obj; 
    } 

あなたのニーズに合わせて調整することができます。例えば、

if (pi.CanRead && pi.CanWrite && 
     (pi.PropertyType == typeof(string) || 
     pi.PropertyType == typeof(int) || 
     pi.PropertyType == typeof(bool)) 
    ) 
{ 
    pi.SetValue(new_obj, pi.GetValue(obj, null), null); 
} 

OR

if (pi.CanRead && pi.CanWrite && 
    (pi.PropertyType.IsEnum || pi.PropertyType.IsArray)) 
{ 
    ...; 
} 
[クローンオブジェクト全体のグラフ]の
+0

これは何とか再帰的に見えませんか? –

関連する問題