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!