2011-10-14 12 views
5

Come si crea una copia di un oggetto di classe senza alcun riferimento? ICloneable crea una copia di un oggetto di classe (tramite una copia superficiale) ma non supporta la copia profonda. Sto cercando una funzione che sia abbastanza intelligente da leggere tutti i membri di un oggetto di classe e fare una copia profonda su un altro oggetto senza specificare i nomi dei membri.Come creare una copia dell'oggetto di classe senza alcun riferimento?

+2

possibile duplicato del [Clone intero grafico Object] (http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos

+1

e veloce soluzione sporca è serializzare l'oggetto e deselezionarlo immediatamente in un altro oggetto. Ovviamente ciò dipende dal fatto che l'oggetto possa essere serializzato correttamente ... – canon

risposta

4

Ho visto questo come una soluzione, in fondo scrivere la propria funzione per fare questo in quanto quello che hai detto riguardo ICloneable non fare una copia profonda

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

sto riferimento a questo thread. 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; 
    } 

È possibile regolare alle vostre esigenze. Ad esempio,

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

O

if (pi.CanRead && pi.CanWrite && 
    (pi.PropertyType.IsEnum || pi.PropertyType.IsArray)) 
{ 
    ...; 
} 
+0

È in qualche modo ricorsivo in modo che non riesco a vedere chiaramente? –

Problemi correlati