我想制作一个对象的深层副本,这样我就可以更改新副本,并且仍然可以选择取消我的更改并取回原始对象。
我的问题是该对象可以是任何类型,即使来自未知程序集。我不能使用BinaryFormatter
or 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很多!