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

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

1、自定Teacher类

    class Teacher
{
public Teacher()
{
}
/// <summary>
/// 老师姓名
/// </summary>
public string TeacherName { get; set; }
/// <summary>
/// 老师的工号
/// </summary>
public string TeacherNumber { get; set; }
/// <summary>
/// 学生列表
/// </summary>
public List<Student> lists { get; set; } }

2、学生类型定义

    class Student
{
/// <summary>
/// 学生姓名
/// </summary>
public string StudentName { get; set; } public Student() { }
}

3、声明并初始化变量

            Teacher teacher = new Teacher()
{
TeacherNumber = "",
TeacherName = "老师1",
lists = new List<Student>
{
new Student { StudentName = "学生1" },
new Student { StudentName = "学生2" }
}
};

4、 对象进行副本的制造

 Teacher teacherAfter = teacher.Copy();

5、Copy方法的实现

   #region 对类进行深度拷贝
/// <summary>
/// 对类进行深度拷贝
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="o"></param>
/// <returns></returns>
public static T Copy<T>(this T o)
{
Assembly assembly = Assembly.GetExecutingAssembly();
Type t = o.GetType();
T t1 = (T)assembly.CreateInstance(t.FullName); PropertyInfo[] PropertyInfos = t.GetProperties(); foreach (PropertyInfo propertyInfo in PropertyInfos)
{
string PropertyName = propertyInfo.Name;
var propertyValue = propertyInfo.GetValue(o, null);
if (propertyValue is IEnumerable<object>)
{
IEnumerable<object> propertyList = propertyValue as IEnumerable<object>;
object list = Activator.CreateInstance(propertyValue.GetType());
foreach (var item in propertyList)
{
var method = list.GetType().GetMethod("Add");
method.Invoke(list, new[] { Copy<object>(item) });
}
propertyInfo.SetValue(t1, list, null);
}
else
{
propertyInfo.SetValue(t1, propertyValue, null);
}
}
return t1;
}
#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. qml: 以鼠标为中心进行放缩;

    import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.2 Window { visible: true widt ...

  2. sklearn-woe/iv-乳腺癌分类器实战

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  3. HDFS集群常见报错汇总

    HDFS集群常见报错汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DataXceiver error processing WRITE_BLOCK operation 报 ...

  4. 分享两个好用的nosql GUI工具

    redis: 真是千呼万唤始出来,终于有了redis gui 谢谢作者,但中文乱码问题貌似还没有解决呀! https://github.com/caoxinyu/RedisClient mongoDB ...

  5. 能使 Oracle 索引失效的六大限制条件【转】

    . 引用自: http://www.cnblogs.com/orientsun/archive/2012/07/05/2577351.html  总结得非常到位 Oracle 索引的目标是避免全表扫描 ...

  6. jenkins笔记

    java -jar jenkins.war -httpPort=9090 以9090端口启动jekins的web应用(内置jetty)

  7. 启用SQL Server 2014 中的OLE 自动化功能

    企业中很多架构都在快走向Service概念,尽量采用平台服务方式提供给各个Application使用.因此,个系统都会去呼叫像是Web Service,WCF或ODATA…等等各种类型的服务.一般来说 ...

  8. oracle杀掉连接

    相关sql --查看当前连接 select count(*) from v$process --数据库允许的最大连接数 select value from v$parameter where name ...

  9. 关闭Android ActionBar

    修改Styles.xml中 <resources> <!-- Base application theme. --> <style name="AppTheme ...

  10. angularjs路由path方式实现原理探究

    angularjs路由 https://angular.io/guide/router 通过URL解释, 来定位客户端生成的浏览器端视图. 你可绑定路由到页面的链接上, 当用户点击链接, 可以浏览到相 ...