using System;
|
using System.Reflection;
|
|
namespace IStation.WinFrmUI
|
{
|
public class DeepCopyHelper
|
{
|
|
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;
|
}
|
|
|
/* 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;
|
}
|
|
|
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;
|
}
|
|
//利用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;
|
}*/
|
|
|
|
|
|
}
|
}
|