克隆数据对象的任何自动方式?

时间:2011-02-27 13:30:48

标签: c# .net

我有一堆不同类型的简单数据对象(所有属性都是可写的,没有隐藏状态)。是否有任何自动方法来克隆这些对象? (是的,我知道手动克隆它们的方法。只是不想^ _ ^)

5 个答案:

答案 0 :(得分:4)

在(内存)流中序列化它们并反序列化它们。

答案 1 :(得分:3)

序列化和反序列化将克隆您的对象。当然,该对象需要是可序列化的。

public static T Clone<T>(T source) 
{
    IFormatter formatter = new BinaryFormatter();
    using (Stream stream = new MemoryStream())
    {
        formatter.Serialize(stream, source);
        stream.Seek(0, SeekOrigin.Begin);
        return (T)formatter.Deserialize(stream);
    }
}

答案 2 :(得分:1)

最好的方法是在所有对象中实现IClonable接口,但是如果不是由您开发的对象不适合您。

第二种方式(我认为最普遍)是使用反射:

    public T CommonClone<T>(T Source)
    {
        T ret = System.Activator.CreateInstance<T>();

        Type typeDescr = typeof(T);

        if (typeDescr.IsClass != true)
        {
            ret = Source;
            return ret;
        }

        System.Reflection.FieldInfo[] fi = typeDescr.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 

        for (int i = 0; i < fi.Length; i++)
        {
            fi[i].SetValue(ret, fi[i].GetValue(Source));
        }

        return ret;
    }

上面的代码将复制公共和私人字段。如果您只需要处理公开的问题,请从BindingFlags.NonPublic方法调用中删除GetFields 这种方式没有对可以使用的对象指定任何限制。它适用于类和结构。

答案 3 :(得分:0)

你可能会看到这个 Deep cloning objects 看看第二个答案。我一直使用它,效果很好。这个解决方案的唯一缺点是类必须是可序列化的

答案 4 :(得分:0)

using System.Web.Helpers;

public static T Clone<T>(T source)
{
    return Json.Decode<T>(Json.Encode(source));        
}