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