我想制作一个对象的深拷贝,这样我就可以更改新副本并仍然有选择取消更改并获取原始对象的选项。
我的问题在于该对象可以是任何类型,甚至来自未知程序集。因为对象不一定有 [Serializable] 属性,所以我不能使用 BinaryFormatter
或 XmlSerializer
。
我尝试使用 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#中对未知对象进行深拷贝呢?
非常感谢!
MemberwiseClone
是_邪恶的_。 - SLaks