码迷,mamicode.com
首页 > Windows程序 > 详细

c#深拷贝

时间:2018-01-20 18:54:26      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:osi   mem   object   反序列化   obj   对象   instance   实现   []   

实现方法:
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;
}

 

c#深拷贝

标签:osi   mem   object   反序列化   obj   对象   instance   实现   []   

原文地址:https://www.cnblogs.com/wang-jin-fu/p/8321314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!