如何创建一个没有任何引用的类对象副本?

6

如何创建一个没有任何引用的类对象副本?ICloneable通过浅复制创建类对象的副本,但不支持深复制。我正在寻找一种聪明的函数,它可以读取类对象的所有成员并将其深度复制到另一个对象中,而不需要指定成员名称。


2
可能是 Clone Whole Object Graph 的重复问题。 - xanatos
1
快速而不太规范的解决方案是将对象序列化,然后立即反序列化为另一个对象。当然,这取决于对象是否能够被正确地序列化... - canon
2个回答

5

我见过这样的解决方案,基本上是编写自己的函数来完成这个任务,因为你所说的ICloneable无法进行深度复制。

public static T DeepCopy(T other)
{
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(ms, other);
        ms.Position = 0;
        return (T)formatter.Deserialize(ms);
    }
}

我参考了这个帖子。复制一个类,C#


0
public static object Clone(object obj)
    {
        object new_obj = Activator.CreateInstance(obj.GetType());
        foreach (PropertyInfo pi in obj.GetType().GetProperties())
        {
            if (pi.CanRead && pi.CanWrite && pi.PropertyType.IsSerializable)
            {
                pi.SetValue(new_obj, pi.GetValue(obj, null), null);
            }
        }
        return new_obj;
    }

您可以根据自己的需求进行调整。例如,

if (pi.CanRead && pi.CanWrite && 
       (pi.PropertyType == typeof(string) || 
        pi.PropertyType == typeof(int) || 
        pi.PropertyType == typeof(bool))
    )
{
    pi.SetValue(new_obj, pi.GetValue(obj, null), null);
}

或者

if (pi.CanRead && pi.CanWrite && 
    (pi.PropertyType.IsEnum || pi.PropertyType.IsArray))
{
    ...;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接