Я хочу сделать глубокую копию объекта, чтобы я мог изменить новую копию и по-прежнему иметь возможность отменить мои изменения и вернуть исходный объект.
Моя проблема здесь в том, что объект может быть любого типа, даже из неизвестной сборки.
Я не могу использовать 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;
}
Проблема в том, что он не работает над перечислимым (массив, список и т.д.), а не в словаре.
Итак, как я могу сделать глубокую копию неизвестного объекта в С#?
TNX много!