2011-10-14 64 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

這是以某種方式遞歸的方式,我無法清楚地看到嗎? –

相關問題