C#中4种深拷贝方法介绍

1:利用反射实现

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;

}

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

public T DeepCopy<T>(T obj)

{

object retval;

using (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)

{

object retval;

using (MemoryStream ms = new MemoryStream())

{

BinaryFormatter bf = new BinaryFormatter();

//序列化成流

bf.Serialize(ms, obj);

ms.Seek(0, SeekOrigin.Begin);

//反序列化成对象

retval = bf.Deserialize(ms);

ms.Close();

}

return (T)retval;

}

4:利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用

public static T DeepCopy<T>(T obj)

{

object retval;

using (MemoryStream ms = new MemoryStream())

{

DataContractSerializer ser = new DataContractSerializer(typeof(T));

ser.WriteObject(ms, obj);

ms.Seek(0, SeekOrigin.Begin);

retval = ser.ReadObject(ms);

ms.Close();

}

return (T)retval;

补充:第一个已经通过递归实现了深拷贝。

以上是 C#中4种深拷贝方法介绍 的全部内容, 来源链接: utcz.com/z/346951.html

回到顶部