Создать глубокую копию в C #

Я хочу сделать глубокую копию объекта, чтобы я мог изменить новую копию и при этом иметь возможность отменить мои изменения и вернуть исходный объект.

Моя проблема здесь в том, что объект может быть любого типа, даже из неизвестной сборки. Я не могу использоватьBinaryFormatter или жеXmlSerializerпотому что объект излишне имеет атрибут [Serializable].

Я пытался сделать это с помощьюObject.MemberwiseClone() метод:

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

Проблема в том, что он не работает со списком (массивом, списком и т. Д.), А не со словарем.

Итак, как я могу сделать глубокую копию неизвестного объекта в C #?

TNX много!

Ответы на вопрос(8)

Ваш ответ на вопрос