1. 程式人生 > >c#深拷貝

c#深拷貝

info return div try 進制 one serialize 利用 binary

實現方法:
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#深拷貝