variable multiple method generic create clase c# .net generics generic-list

c# - multiple - ¿Cómo hacer una copia correcta de la lista<MyObject>?



generics c# (3)

Posible duplicado:
¿Cómo puedo clonar una lista genérica en C #?

List<MyObject> a1 = new List<MyObject>(); var new1 = a1;

Ahora si cambio a1 entonces también se cambiará new1 .

¿Entonces mi pregunta es cómo hacer un clon de a1 correctamente?


Creo que la práctica general es evitar el uso de Clone porque no está claro si se trata de una copia del objeto con poca profundidad o profundidad.

Más sobre eso aquí: http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx

Una solución bastante común ha sido utilizar la clase BinaryFormatter para serializar / derializar un objeto y devolver la nueva instancia, pero con la advertencia de que la clase debe ser serializable:

https://.com/a/1213649/1212407

Asumiendo lo anterior, podrías hacer:

var clonedList = originaList.DeepClone();


Esto no Clone cada elemento de la lista, sino que creará una nueva lista

var new1 = new List<MyObject>(a1);

Si desea clonar cada elemento en la lista, puede implementar ICloneable en MyObject

var new1 = new List<MyObject>(a1.Select(x => x.Clone()));

EDITAR: Para que quede un poco más claro, ambos copiarán los elementos de la lista a1 en una nueva lista. Solo necesita decidir si desea tener MyObject nuevos o conservar los originales. Si desea clonar MyObject , necesitará una forma de clonarlos, que normalmente se realiza a través de ICloneable .


O bien, podrías hacer algo como esto:

public static class CloneClass { /// <summary> /// Clones a object via shallow copy /// </summary> /// <typeparam name="T">Object Type to Clone</typeparam> /// <param name="obj">Object to Clone</param> /// <returns>New Object reference</returns> public static T CloneObject<T>(this T obj) where T : class { if (obj == null) return null; System.Reflection.MethodInfo inst = obj.GetType().GetMethod("MemberwiseClone", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); if (inst != null) return (T)inst.Invoke(obj, null); else return null; } }

Entonces úsalo como:

var new1 = CloneClass.CloneObject<List<<MyObject>>(a1);