C# 的三种对象深拷贝方法

  1. 实现ICloneable 接口,自定义拷贝功能
  2. 序列化/反序列化类实现
  3. 通过反射来创建新的对象实例

No.1 实现ICloneable接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
publi class Person : ICloneable
{
    public int Age { get; set;}
    public string Address { get; set; }
    public string Name { get; set; }
    public Object Clone()
    {
        Person _temp = new Person();
        _temp.Address = this.Address;
        _temp.Age = this.Age;
        _temp.Name = this.Name;
        return _temp;
    }
}

No.2 序列化/反序列化类实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[Serializable]
public class Person :ICloneable
{
    public object Clone()
    {
        using(MemoryStream _ms = new MemoryStream(1000))
        {
            object _cloneObject;
            BinaryFormatter _bf = new BinaryFormatter(null,new StreamingContext(StreamingContextStates.Clone));
            _bf.Serialize(_ms,this);
            _ms.Seek(0,SeekOrigin.Begin);
            _cloneObject = _bf.Deserialize(_ms);
            return _cloneObject;
        }
    }
}

当然还有另外一种方法,那就是通过Json.Net来进行序列化之后再反序列化对象,同样可以实现深度拷贝。

No.3 通过反射来创建一个新的对象实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public static T ObjectClone<T>(T model)
{
    var _oRes = default(T);
    var _oType = typeof(T);

    // 创建一个新的对象
    _oRes = (T)Activator.CreateInstance(_oType);

    // 批量对新对象的属性进行赋值
    var _propertys = _oType.GetProperties();
    foreach(var _pro in _propertys)
    {
        var _oldValue = _pro.GetValue(model);
        _pro.SetValue(_oRes,_oldValue);
    }
    return _oRes;
}

这种方法非常简单,也很容易理解。不过反射单个元素还好,如果是Clone一个集合的话,效率是一个很严重的问题。

Built with Hugo
主题 StackJimmy 设计