ICloneable接口
ICloneable接口包含一个Clone方法,可以用来创建当前对象的拷贝。
public interface ICloneable
{
object Clone();
}
支持MemberWiseClone()方法,浅表克隆
public class Person : ICloneable
{
public string Name;
public Person Spouse;
public object Clone()
{
return this.MemberwiseClone();
}
}
避免强制转换
public class Person : ICloneable
{
public string Name;
object ICloneable.Clone()
{
return this.Clone();
}
public Person Clone()
{
return (Person)this.MemberwiseClone();
}
}
反射克隆
/// <summary>
/// 克隆
/// </summary>
public static T Clone<T>(T obj)
{
T t = Activator.CreateInstance<T>();
Type type = t.GetType();
foreach (PropertyInfo p in type.GetProperties())
{
p.SetValue(t, p.GetValue(obj));
}
return t;
}
public static TOut Clone<TIn, TOut>(TIn tIn)
{
TOut tOut = Activator.CreateInstance<TOut>();
var tInType = tIn.GetType();
foreach (var itemOut in tOut.GetType().GetProperties())
{
var itemIn = tInType.GetProperty(itemOut.Name); ;
if (itemIn != null)
{
itemOut.SetValue(tOut, itemIn.GetValue(tIn));
}
}
return tOut;
}
说明:以实方法都是浅克隆,如果对象里面嵌套对象时候,克隆出来的只是赋值的子对象的引用,并没有把子对象的属性深度赋值,所以对应包含子对象的需要进行特殊处理。