在C#中创建深层复制

Ora*_* SA 12 c# deep-copy

我想制作一个对象的深层副本,这样我就可以更改新副本,并且仍然可以选择取消我的更改并取回原始对象.

我的问题是,对象可以是任何类型,即使是来自未知的程序集.我不能使用BinaryFormatterXmlSerializer,因为该对象不必具有[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;
}
Run Code Online (Sandbox Code Playgroud)

这个问题是,它不是在可枚举(数组,列表等),而不是在字典上.

那么,如何在C#中创建未知对象的深层副本?

TNX很多!

SLa*_*aks 13

深度复制任意对象是完全不可能的.

例如,你将如何处理一个Control或一个FileStream或一个HttpWebResponse

您的代码无法知道对象的工作方式以及字段应包含的内容.

不要这样做.
这是灾难的秘诀.