定义学生

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

定义老师

    /// <summary>
/// 老师信息
/// </summary>
public class Teacher
{
/// <summary>
/// 老师姓名
/// </summary>
public string TeacherName { get; set; }
/// <summary>
/// 学生列表
/// </summary>
public List<Student> lists { get; set; }
}

自定教授类

    public class Professor : Teacher
{ }

将t1对象拷贝到p1上

   Teacher t1 = new Teacher()
{
TeacherName = "老师1",
lists = new List<Student> { new Student { StudentName = "学生1" }, new Student { StudentName = "学生2" } }
}; Professor p1 = new Professor()
{ lists = new List<Student> { },
};
CloneEntity(t1, p1);

实现代码如下

        //更新普通属性
private static void CloneProperty(PropertyInfo propertyInfo, object intrinsicObj, object newObj)
{
var data = propertyInfo.GetValue(newObj, null);
if (data is IEnumerable<object>)
CloneNavigationPropertyEntityCollection(propertyInfo, intrinsicObj, newObj);
else
propertyInfo.SetValue(intrinsicObj, data, null);
} private static void CloneNavigationPropertyEntityCollection(PropertyInfo propertyInfo, object intrinsicObj, object newObj)
{ //获取上下文中匹配的原对象集合
var intrinsicData = propertyInfo.GetValue(intrinsicObj, null);
//获取参数newObj中的对象集合
IEnumerable<object> newData = propertyInfo.GetValue(newObj, null) as IEnumerable<object>;
var addMethod = intrinsicData.GetType().GetMethod("Add");
foreach (object obj in newData)
{ Object objClone = GetIntrinsicObj(obj);
objClone = CloneEntity(obj, objClone);
addMethod.Invoke(intrinsicData, new object[] { objClone });
}
} //获取上下文中待更新的原对象
private static Object GetIntrinsicObj(Object entity)
{
Object intrinsicObj;
intrinsicObj = Activator.CreateInstance(entity.GetType()); return intrinsicObj;
} //更新上下文中的原对象,返回值为更新后的原对象
public static Object CloneEntity(Object obj, Object intrinsicObj)
{
foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
{
CloneProperty(propertyInfo, intrinsicObj, obj);
}
return intrinsicObj;
}

下载源代码

.NET中制做对象的副本(二)继承对象之间的数据拷贝的更多相关文章

  1. HTML5中window.postMessage,在两个页面之间的数据传递

    HTML5中window.postMessage,在两个页面之间的数据传递 2015年11月3日 8536次浏览 关于postMessage window.postMessage虽然说是html5的功 ...

  2. Vue 爬坑之路(二)—— 组件之间的数据传递

    Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...

  3. (转)Vue 爬坑之路(二)—— 组件之间的数据传递

    Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...

  4. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  5. js 对象的创建方式和对象的区别

    js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, 1 2 3 4 5 6 7 8 9 10 11 12 ...

  6. Asp.net MVC中 Controller 与 View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...

  7. 25 JavaScript对象原型&ES5新的对象方法

    JavaScript对象原型 所有JavaScript对象都从原型继承对象和方法 日期对象继承自Date.prototype,数组继承自Array.prototype,对象构造器新建的对象Person ...

  8. .NET中制做对象的副本(一)

    .NET中对于复杂对象制作副本比较困难,闲暇之时写了这个方法,和大家分享. 本案例用于大型对象的副本制作,常见的应用场景就是树形对象节点的拷贝,但是也有局限性,目前使用于类里有基本类型(int sti ...

  9. Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限

    一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...

随机推荐

  1. MT【41】利用不等式妙消参数

    已知$\theta\in[0,2\pi]$对任意$x\in[0,1],2x^2sin\theta-4x(1-x)cos\theta+3(1-x)^2>0$恒成立.求$\theta$的范围. 解答 ...

  2. 06 自学Aruba之win7系统802.1x认证网卡设置指导

    点击返回:自学Aruba之路 06 自学Aruba之win7系统802.1x认证网卡设置指导 步骤1.在桌面任务栏找到“打开网络和共享中心”,点击进入: 步骤2.点击“管理无线网络”,进入无线网络配置 ...

  3. 自学Zabbix9.1 Network Discovery 网络发现原理

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix9.1 Network Discovery 网络发现原理 1. 网络发现简介 网络 ...

  4. Problem C: 文体双花 解题报告

    Problem C: 文体双花 被A穿的题,我这个屑只拿了20... 意识到这个题简单的时候考试已经快结束了,那边又各种吵,不过下午改题的情况来看,我可能码力还有点问题... 据神O所说,出这个题的时 ...

  5. Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)

    Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...

  6. Kafka+Log4j2日志

    默认你已经安装配置了Zookeeper和Kafka. 为了目录清晰,我的Kafka配置文件的Zookeeper部分是:加上了节点用来存放Kafka信息 启动Zookeeper,然后启动Kafka. Z ...

  7. 元组&哈希&字典

    1.元组(1)特性:不可变(不能修改.添加.删除),可以做切片 元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变(元组里套用列表,列表中的值可变)(2)功能: index count ...

  8. 不跳转修改url(history.pushState)

    有时候我们会想不跳转的情况下修改url 直接上代码吧: history.pushState(null,"","?test=123") 值得注意的是,为了用户安全 ...

  9. saltstack安装与配置

    Saltstack是基于Python开发的一套C/S架构,具备Puppet.Ansible功能于一身的配置管理工具,功能十分强大,各模块融合度及复用性极高:使用号称世界上最快的消息队列ZeroMQ使得 ...

  10. 8、JPA-映射-双向一对一

    一个管理对应一个部门,一个部门对应一个管理,例中由部门维护关联关系 实体类 Department package com.jpa.yingshe; import javax.persistence.* ...