Я хочу сделать глубокую копию объекта, чтобы я мог изменить новую копию и при этом иметь возможность отменить мои изменения и вернуть исходный объект.
Моя проблема здесь в том, что объект может быть любого типа, даже из неизвестной сборки.
Я не могу использовать 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 много!