2011-10-14 16 views
5

¿Cómo creo una copia de un objeto de clase sin ninguna referencia? ICloneable hace una copia de un objeto de clase (mediante una copia superficial) pero no admite la copia en profundidad. Estoy buscando una función que sea lo suficientemente inteligente como para leer todos los miembros de un objeto de clase y hacer una copia profunda a otro objeto sin especificar los nombres de los miembros.¿Cómo crear una copia del objeto de clase sin ninguna referencia?

+2

posible duplicado de [Graph objeto entero Clone] (http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos

+1

rápida y La solución sucia es serializar el objeto e inmediatamente deserializarlo a otro objeto. Por supuesto, eso depende de si el objeto puede ser serializado adecuadamente ... – canon

Respuesta

4

que he visto esto como una solución, básicamente escribir su propia función para hacer esto ya que lo que ha dicho sobre ICloneable no hacer una copia profunda

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

Estoy referencia a este hilo. 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; 
    } 

Se puede ajustar a sus necesidades. Por ejemplo,

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

¿Es esto de alguna manera recursivo que no puedo ver claramente? –

Cuestiones relacionadas