栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

c#深拷贝的方法

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c#深拷贝的方法

1. ICloneable实现


    class MyClass : ICloneable
    {
       public int val;

       public Object Clone()
       {
           MyClass myCls = new MyClass();
           myCls.val = this.val;
           return myCls;
       }
    }


    class Program
    {
       static void Main(string[] args)
       {
          MyClass objectA = new MyClass();
          MyClass objectB = objectA.Clone() as MyClass;
          objectA.val = 10;
          objectB.val = 20;
          Console.WriteLine("objectA.val = {0}", objectA.val);
          Console.WriteLine("objectB.val = {0}", objectB.val);
          Console.ReadKey();
       }

}

2. 反射机制实现


    class MyClass : ICloneable
    {
       public int val;
    }


    class Program
    {
       static void Main(string[] args)
       {
          MyClass objectA = new MyClass();
          MyClass objectB = DeepCopyByReflection(objectA);
          objectA.val = 10;
          objectB.val = 20;
          Console.WriteLine("objectA.val = {0}", objectA.val);
          Console.WriteLine("objectB.val = {0}", objectB.val);
          Console.ReadKey();
       }
    
        ///


        /// 反射机制
        ///

        /// 模板类型
        /// 拷贝的对象
        /// 返回拷贝的类型
       public static T DeepCopyByReflection(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;
       }
}

3. 序列化:
    [Serializable]
    class MyClass : ICloneable
    {
       public int val;
    }
    class Program
    {
       static void Main(string[] args)
       {
          MyClass objectA = new MyClass();
          MyClass objectB = DeepCopyByBinary(objectA);
          objectA.val = 10;
          objectB.val = 20;
          Console.WriteLine("objectA.val = {0}", objectA.val);
          Console.WriteLine("objectB.val = {0}", objectB.val);
          Console.ReadKey();
       }
    
        ///


        /// 二进制序列化拷贝
        ///

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

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号