Criar uma cópia profunda em c #
Quero fazer uma cópia profunda de um objeto para poder alterar a nova cópia e ainda ter a opção de cancelar minhas alterações e recuperar o objeto original.
Meu problema aqui é que o objeto pode ser de qualquer tipo, mesmo de um assembly desconhecido. Eu não posso usarBinaryFormatter
ouXmlSerializer
, porque o objeto desnecessariamente tem o atributo [Serializable].
Eu tentei fazer isso usando oObject.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;
}
O problema é que ele não está funcionando em um enumerável (matriz, lista etc.), e não no dicionário.
Então, como posso fazer uma cópia profunda de um objeto desconhecido em c #?
TNX muito!