.NET中制做对象的副本(一)
.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中制做对象的副本(一)的更多相关文章
- .NET中制做对象的副本(二)继承对象之间的数据拷贝
定义学生 /// <summary> /// 学生信息 /// </summary> public class Student { /// <summary> // ...
- .NET中制做对象的副本(三)通过序列化和反序列化为复杂对象制作副本
1.类的定义 /// <summary> /// 学生信息 /// </summary> [Serializable] public class Stu { /// <s ...
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- C#[Serializable]在C#中的作用-NET 中的对象序列化
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...
- Serializable在C#中的作用.net中的对象序列化 (转)
序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...
- 使用ThreadLocal管理Mybatis中SqlSession对象
转自http://blog.csdn.net/qq_29227939/article/details/52029065 public class MybatisUtil { private stati ...
- JS中的对象和方法简单剖析
众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
- HTML中DOM对象的属性和方法的层级关系是怎样的?(目录即层次)
HTML中DOM对象的属性和方法的层级关系是怎样的?(目录即层次) 一.总结 一句话总结:目录就是测试题 1.document取得元素(get element)的方式有哪几种? 解答:四种,分别是id ...
随机推荐
- mac设计师系列 Adobe “全家桶” 15款设计软件 值得收藏!
文章素材来源:风云社区.简书 文章收录于:风云社区 www.scoee.com,提供1700多款mac软件下载 Adobe Creative Cloud 全线产品均可开放下载(简称Adobe CC 全 ...
- 关于java文件下载文件名乱码问题解决方案
JAVA文件下载时乱码有两种情况: 1,下载时中文文件名乱码 2,下载时因为路径中包含中文文件名乱码,提示找不到文件 解决方法见下面部分代码 response.setContentType(" ...
- perl trick
一.die if以及文件的操作 #!/usr/bin/perl -w use strict; die "USAGE:\n\tperl $0 <><><>\ ...
- urllib 学习一
说明:Urllib 是一个python用于操作URL的模块 python2.x ----> Urillib/Urllib2 python3.x ----> Urllib ...
- mysql 快速生成删除数据库中所有的表的语句
SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_s ...
- Linux下weblogic10.3.6(jar)版本安装详解
一.安装前的准备 安装weblogic是需要JDK环境的,虽然weblogic有自带的JDK,但是我一般是自己选择JDK进行安装,如果你要自行安装,可以参考我的另一篇博客 https://www.cn ...
- 深入浅出 JavaWeb:Servlet必会必知
一.Web服务器 从事web开发的人,会很清楚一个东西叫HTTP服务器,比如JEE开发—Tomcat,Jetty,.NET开发—ISS等.HTTP服务器是使用 HTTP(超文本传输协议) 与客户机浏览 ...
- Redis之路
前言:数据库是一切数据的源头,因此我们没有逃避的理由 (一) 什么是redis? redis是nosql(not noly sql)产品中最为出色的一种非关系型的数据库,主要包括以下几种存储结构:St ...
- jQuery使用(三):DOM操作之val()方法操作表单元素value值
操作表单元素属性value的值 <form action="./" method='GET'> <h3 >选择你喜欢的明星</h3> <s ...
- 【1】【leetcode-127】单词接龙word-ladder
(不会,经典广度优先搜索) 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改 ...