2011-10-14 20 views
5

Sınıf nesnesinin bir kopyasını referans olmadan nasıl oluşturabilirim? ICloneable, bir sınıf nesnesinin bir kopyasını (sığ kopya yoluyla) yapar, ancak derin kopyalamayı desteklemez. Bir sınıf nesnenin tüm üyelerini okuyabilecek ve üye isimlerini belirtmeden başka bir nesneyi derinlemesine kopyalayabilecek kadar akıllı bir işlev arıyorum. Bir çözüm olarak bu gördüğümSınıf nesnesinin bir kopyası referans olmadan nasıl oluşturulur?

+2

olası yinelenen (http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos

+1

Hızlı ve Kirli çözüm, nesneyi serileştirmek ve hemen başka bir nesneye serpmektir. Tabii ki, bu nesnenin düzgün bir şekilde serileştirilip geçirilemeyeceğine bağlıdır ... – canon

cevap

4

, temelde ICloneable derin bir kopyasını

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

Ben bu konuyu başvuran ediyorum yapmıyor hakkında söylediklerini beri bunu yapmak için kendi fonksiyonunu yazın. 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; 
    } 

Sen ihtiyaçlarınıza ayarlayabilirsiniz. Örneğin,

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

VEYA

if (pi.CanRead && pi.CanWrite && 
    (pi.PropertyType.IsEnum || pi.PropertyType.IsArray)) 
{ 
    ...; 
} 
[Klon Tüm Nesne Grafik] arasında
+0

Bu, bir şekilde, açıkça göremediğim şekilde, özendirici mi? –

İlgili konular