c#深拷贝

实现方法:
1.利用二进制序列化和反序列化实现,需要注意的时,这个方法使用了序列化,所以使用此方的对象必须是可序列化的。

public GoodItem CloneItem()
{
    MemoryStream stream = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, this);
    stream.Position = 0;
    return formatter.Deserialize(stream) as GoodItem;
}

2.利用xml序列化和反序列化实现

public T DeepCopy<T>(T obj)
{
    object retval;
    MemoryStream ms = new MemoryStream()
    XmlSerializer xml = new XmlSerializer(typeof(T));
    xml.Serialize(ms, obj);
    ms.Seek(0, SeekOrigin.Begin);
    retval = xml.Deserialize(ms);
    ms.Close();
    return (T)retval;
}

3.利用反射实现

public static T DeepCopy<T>(T obj)
{
    //如果是字符串或值类型则直接返回
    if (obj is string || obj.GetType().IsValueType) return obj;

    object retval = Activator.CreateInstance(obj.GetType());
    FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    foreach (FieldInfo field in fields)
    {
        try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
        catch { }
    }
    return (T)retval;
}

 

posted @ 2018-01-20 17:20  柯腾_wjf  阅读(150)  评论(0编辑  收藏  举报