.NET中对于复杂对象制作副本比较困难,闲暇之时写了这个方法,和大家分享。

本案例用于大型对象的副本制作,常见的应用场景就是树形对象节点的拷贝,但是也有局限性,目前使用于类里有基本类型(int stirng float 等)的属性和泛型属性的拷贝,其他的拷贝暂时不支持。

1、自定Teacher类

  1. class Teacher
  2. {
  3. public Teacher()
  4. {
  5. }
  6. /// <summary>
  7. /// 老师姓名
  8. /// </summary>
  9. public string TeacherName { get; set; }
  10. /// <summary>
  11. /// 老师的工号
  12. /// </summary>
  13. public string TeacherNumber { get; set; }
  14. /// <summary>
  15. /// 学生列表
  16. /// </summary>
  17. public List<Student> lists { get; set; }
  18.  
  19. }

2、学生类型定义

  1. class Student
  2. {
  3. /// <summary>
  4. /// 学生姓名
  5. /// </summary>
  6. public string StudentName { get; set; }
  7.  
  8. public Student() { }
  9. }

3、声明并初始化变量

  1. Teacher teacher = new Teacher()
  2. {
  3. TeacherNumber = "",
  4. TeacherName = "老师1",
  5. lists = new List<Student>
  6. {
  7. new Student { StudentName = "学生1" },
  8. new Student { StudentName = "学生2" }
  9. }
  10. };

4、 对象进行副本的制造

  1. Teacher teacherAfter = teacher.Copy();

5、Copy方法的实现

  1. #region 对类进行深度拷贝
  2. /// <summary>
  3. /// 对类进行深度拷贝
  4. /// </summary>
  5. /// <typeparam name="T"></typeparam>
  6. /// <param name="o"></param>
  7. /// <returns></returns>
  8. public static T Copy<T>(this T o)
  9. {
  10. Assembly assembly = Assembly.GetExecutingAssembly();
  11. Type t = o.GetType();
  12. T t1 = (T)assembly.CreateInstance(t.FullName);
  13.  
  14. PropertyInfo[] PropertyInfos = t.GetProperties();
  15.  
  16. foreach (PropertyInfo propertyInfo in PropertyInfos)
  17. {
  18. string PropertyName = propertyInfo.Name;
  19. var propertyValue = propertyInfo.GetValue(o, null);
  20. if (propertyValue is IEnumerable<object>)
  21. {
  22. IEnumerable<object> propertyList = propertyValue as IEnumerable<object>;
  23. object list = Activator.CreateInstance(propertyValue.GetType());
  24. foreach (var item in propertyList)
  25. {
  26. var method = list.GetType().GetMethod("Add");
  27. method.Invoke(list, new[] { Copy<object>(item) });
  28. }
  29. propertyInfo.SetValue(t1, list, null);
  30. }
  31. else
  32. {
  33. propertyInfo.SetValue(t1, propertyValue, null);
  34. }
  35. }
  36. return t1;
  37. }
  38. #endregion

代码讲解

1、首先这是个拓展方法,拓展方法不懂得百度去。

2、 10行、11行、12行用于实现一个类型的实例化t1。

3、通过遍历o的属性对拷贝对象t1进行赋值,这是针对基本类型的属性而言,对于IEnumerable就涉及到类型转换,然后进行遍历,递归调用Copy方法。

提供demo的下载地址 下载

.NET中制做对象的副本(一)的更多相关文章

  1. .NET中制做对象的副本(二)继承对象之间的数据拷贝

    定义学生 /// <summary> /// 学生信息 /// </summary> public class Student { /// <summary> // ...

  2. .NET中制做对象的副本(三)通过序列化和反序列化为复杂对象制作副本

    1.类的定义 /// <summary> /// 学生信息 /// </summary> [Serializable] public class Stu { /// <s ...

  3. javascript中的对象,原型,原型链和面向对象

    一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...

  4. C#[Serializable]在C#中的作用-NET 中的对象序列化

    为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...

  5. Serializable在C#中的作用.net中的对象序列化 (转)

    序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...

  6. 使用ThreadLocal管理Mybatis中SqlSession对象

    转自http://blog.csdn.net/qq_29227939/article/details/52029065 public class MybatisUtil { private stati ...

  7. JS中的对象和方法简单剖析

    众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...

  8. 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承

    ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...

  9. HTML中DOM对象的属性和方法的层级关系是怎样的?(目录即层次)

    HTML中DOM对象的属性和方法的层级关系是怎样的?(目录即层次) 一.总结 一句话总结:目录就是测试题 1.document取得元素(get element)的方式有哪几种? 解答:四种,分别是id ...

随机推荐

  1. BZOJ4653 尺取法 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4653 首先很容易想到离散之后排序,用线段树或者树状数组去维护. 问题在于按照什么排序,如果按照左端 ...

  2. 1053. Path of Equal Weight (30)

    Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of ...

  3. Hadoop问题:There are 0 datanode(s) running and no node(s) are excluded in this operation.

    问题描述: org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /tmp/hadoop-yarn/staging/hado ...

  4. python 深浅拷贝 for循环删除

    ###########################总结########################### 1. 基础数据类型补充 大多数的基本数据类型的知识.已经学完了 a='aaaa' ls ...

  5. 使用git遇到的一些问题

    上传github时忽略.DS_Store方法 这个文件在mac中是管理文件夹的位置之类的信息,所以并没有必要上传到git中,这个时候就需要用git.gitignore文件来忽略此类文件. 在默认情况下 ...

  6. Hadoop记录-安装ambari hdp集群

    #!/bin/sh #配置用户sudo权限(参考/etc/sudoers文件,在/etc/sudoers.d/新建一个用户配置文件,注意要注销) #需要在/etc/sudoers末尾追加:sfapp ...

  7. 前台ajax传参数,后台spring mvc用对象接受

    第二种方法:利用spring mvc的机制,调用对象的get方法,要求对象的属性名和传的参数名字一致(有兴趣的同学看 springmvc源码) 1.将参数名直接写成对象的属性名 $.ajax({ ur ...

  8. 使用wget命令下载JDK失败(文件特别小)

    问题RT: 我们在网页上下载的时候要点一下 “Accept License Agreement ” ,使用wget下载的时候也需要提交这个 accept,方法如下: wget --no-check-c ...

  9. KafkaConsumer 长时间地在poll(long )方法中阻塞

    一,问题描述 搭建的用来测试的单节点Kafka集群(Zookeeper和Kafka Broker都在同一台Ubuntu上),在命令行下使用: ./bin/kafka-topics. --replica ...

  10. Android RelativeLayout属性含义

    a).第一类:属性值为true或false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android ...