- 实现ICloneable 接口,自定义拷贝功能
- 序列化/反序列化类实现
- 通过反射来创建新的对象实例
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一个集合的话,效率是一个很严重的问题。