当前位置:首页 > Windows程序 > 正文

C# 深拷贝

2024-03-31 Windows程序

关于C#的深拷贝的实现方式:

①反射

②反序列化

③表达式树

目前只讲解利用反射实现C#深拷贝的方法:

深拷贝工具类:

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace CopyDemo {     public sealed class CopyTools     {         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个类用于测试:

宠物类->

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CopyDemo {     public sealed class Pet     {         public string Name { get; set; }     } }

人物类->

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CopyDemo {     public sealed class People     {         public string Name { set; get; }         public Pet My_Pet { get; set; }     } }

测试代码:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CopyDemo {     public class Program     {         static void Main(string[] args)         {             People A = new People() {My_Pet = new Pet()};             A.Name = "Aonaufly";             A.My_Pet.Name = "小白";             Console.WriteLine("=================================================");             People _copyA = CopyTools.DeepCopy<People>(A);             _copyA.Name = "Kayer";             _copyA.My_Pet.Name = "旺财";             Console.WriteLine("源 name : {0} , petName : {1}" , A.Name,A.My_Pet.Name);             Console.WriteLine("Copy name : {0} , petName : {1}", _copyA.Name, _copyA.My_Pet.Name);             Console.ReadKey();         }     } }

运行结果:

技术分享

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/40539.html

Jm-杰米博客Jamie
草根站长的技术交流乐园!IT不会不要紧快来好好学习吧!
  • 20786文章总数
  • 7494595访问次数
  • 建站天数
  • 友情链接