C# 实体类几种深拷贝的方法——解决关于对象赋值,A=B,A改变,B也改变问题
幾種常見的深拷貝方式
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;
}
總結
以上是生活随笔為你收集整理的C# 实体类几种深拷贝的方法——解决关于对象赋值,A=B,A改变,B也改变问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 系统如何启动服务,如何查看和
- 下一篇: C#调用 Halcon引擎执行代码