Crear una copia profunda en C #
Quiero hacer una copia profunda de un objeto para poder cambiar la nueva copia y aún tener la opción de cancelar mis cambios y recuperar el objeto original.
Mi problema aquí es que el objeto puede ser de cualquier tipo, incluso de un ensamblaje desconocido. No puedo usarBinaryFormatter
oXmlSerializer
, porque el objeto tiene innecesariamente el atributo [Serializable].
He intentado hacer esto usando elObject.MemberwiseClone()
método:
public object DeepCopy(object obj)
{
var memberwiseClone = typeof(object).GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic);
var newCopy = memberwiseClone.Invoke(obj, new object[0]);
foreach (var field in newCopy.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
if (!field.FieldType.IsPrimitive && field.FieldType != typeof(string))
{
var fieldCopy = DeepCopy(field.GetValue(newCopy));
field.SetValue(newCopy, fieldCopy);
}
}
return newCopy;
}
El problema en esto es que no está funcionando en un enumerable (matriz, lista, etc.), no en un diccionario.
Entonces, ¿cómo puedo hacer una copia profunda de un objeto desconocido en C #?
¡Muchas gracias!