天天看點

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;

}

利用二進制序列化和反序列化實作

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;

}