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

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

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

Я пытался сделать это, используя Object.MemberwiseClone () method:

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 много!

12
задан Orad SA 5 September 2010 в 17:42
поделиться