当前位置: 代码迷 >> 综合 >> C# 实体类几种深拷贝的方法——解决关于对象赋值,A=B,A改变,B也改变问题
  详细解决方案

C# 实体类几种深拷贝的方法——解决关于对象赋值,A=B,A改变,B也改变问题

热度:54   发布时间:2024-02-06 15:03:11.0

几种常见的深拷贝方式

1、利用反射实现

public static T DeepCopyByReflection<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.Static|BindingFlags.Instance);
foreach(var field in fields)
{
try
{
field.SetValue(retval, DeepCopyByReflection(field.GetValue(obj)));
}
catch { }
}

  return (T)retval;
}

2、利用二进制序列化和反序列化

public static T DeepCopyByBinary<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;
}

注意,使用二进制序列化和反序列化时,在需要序列化的类上要加上[Serializable]

[Serializable]
public class Person
{
public string Name { get; set; }
}

 

3、利用xml序列化和反序列化

public static T DeepCopyByXml<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;
}

  相关解决方案