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!

questionAnswers(8)

yourAnswerToTheQuestion