C# 对象复制
- /// <summary>
- /// 把DataTable对象转成List<T>对象
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="table"></param>
- /// <returns></returns>
- public static List<T> ConvertToModel<T>(this DataTable table) where T : new()
- {
- var list = new List<T>();
- PropertyInfo[] propertys = typeof(T).GetProperties();
- foreach (DataRow row in table.Rows)
- {
- T model = Activator.CreateInstance<T>();
- foreach (PropertyInfo pi in propertys)
- {
- var tempName = pi.Name;
- if (!table.Columns.Contains(tempName)) continue;
- if (!pi.CanWrite) continue;
- object value = Convert.ToString(row[tempName]);
- if (value != DBNull.Value)
- {
- pi.SetValue(model, value, null);
- }
- }
- list.Add(model);
- }
- return list;
- }
- /// <summary>
- /// 把具有同结构的实体赋值到另外一个实体
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="from"></param>
- /// <returns></returns>
- public static T ConvertTo<T>(this object from) where T : new()
- {
- if (from == null)
- {
- return default(T);
- }
- var to = Activator.CreateInstance<T>();
- return from.CopyTo<T>(to);
- }
- /// <summary>
- /// 通过比较属性名称来给目标实体赋值
- /// </summary>
- /// <typeparam name="T">泛型实体</typeparam>
- /// <param name="from">原实体</param>
- /// <param name="to">目标实体</param>
- /// <returns></returns>
- public static T CopyTo<T>(this object from, T to) where T : new()
- {
- if (from == null)
- {
- return to;
- }
- if (to == null)
- {
- to = Activator.CreateInstance<T>();
- }
- PropertyDescriptorCollection fromProperties = TypeDescriptor.GetProperties(from);
- PropertyDescriptorCollection toProperties = TypeDescriptor.GetProperties(to);
- foreach (PropertyDescriptor fromProperty in fromProperties)
- {
- PropertyDescriptor toProperty = toProperties.Find(fromProperty.Name, true);
- if (toProperty != null && !toProperty.IsReadOnly)
- {
- bool isDirectlyAssignable = toProperty.PropertyType.IsAssignableFrom(fromProperty.PropertyType);
- bool liftedValueType = !isDirectlyAssignable && Nullable.GetUnderlyingType(fromProperty.PropertyType) == toProperty.PropertyType;
- if (isDirectlyAssignable || liftedValueType)
- {
- object fromValue = fromProperty.GetValue(from);
- if (isDirectlyAssignable || (fromValue != null && liftedValueType))
- {
- toProperty.SetValue(to, fromValue);
- }
- }
- }
- }
- return to;
- }
- /// <summary>
- /// 把实体转换成一个dynamic对象
- /// </summary>
- /// <param name="value"></param>
- /// <returns></returns>
- public static dynamic ToDynamic(this object value)
- {
- IDictionary<string, object> expando = new ExpandoObject();
- foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
- {
- expando.Add(property.Name, property.GetValue(value));
- }
- return expando as ExpandoObject;
- }
C# 对象复制的更多相关文章
- PHP基础知识之对象复制
对象的复制默认为浅复制 进行深复制的方法为:在类中定义魔法方法__clone(),类的对象复制时,会自动调用 __clone方法,在 __clone方法中可以进行各种复制对象的个性化 class My ...
- JS对象复制
在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...
- PHP写时复制, 变量复制和对象复制不同!!!
2016年3月18日 15:09:28 星期五 一直以为PHP对象也是写时复制....... 其实: PHP的变量是写时复制, 对象是引用的 写时复制: $a = $b; 如果$b的内容不改变, $a ...
- 【转】JavaScript中的对象复制(Object Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...
- 对象复制、克隆、深度clone
-------------------------------------------------------------------------------- ------------------- ...
- PHP5的对象复制
今天用yii开发程序,一个bug改了一晚上,最后发现问题出在了对象复制机制上,PHP5之前的对象复制只需要$object_a = $object_b即可,但PHP5这样得到的是浅复制,及指针指向,并不 ...
- Java反射 - 2(对象复制,父类域,内省)
为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...
- js原生设计模式——7原型模式之真正的原型模式——对象复制封装
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- JS对象复制(深拷贝、浅拷贝)
如何在 JS 中复制对象 在本文中,我们将从浅拷贝(shallow copy)和深拷贝(deep copy)两个方面,介绍多种 JS 中复制对象的方法. 在开始之前,有一些基础知识值得一提:Javas ...
- JavaScript对象复制(一)(转载)
在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...
随机推荐
- 无节操cocos2d-js游戏
1. <看谁抽得快> 2. <拍苍蝇> 3. <月饼达人> 4. <亲吻小游戏> 下面这些是本人做的,需要源代码的可以回复我 ps:全部采 ...
- 最长公共上升子序列 (poj 2127) (Greatest Common Increasing Subsequence)
\(Greatest Common Increasing Subsequence\) 大致题意:给出两个长度不一定相等的数列,求其中最长的公共的且单调递增的子序列(需要具体方案) \(solution ...
- python 2: 解决python中的plot函数的图例legend不能显示中文问题
问题: 图像标题.横纵坐标轴的标签都能显示中文名字,但是图例就是不能显示中文,怎么解决呢? 解决: plt.figure() plt.title(u'训练性能', fontproperties=f ...
- luogu3373 【模板】线段树2
题目大意: 已知一个数列,你需要进行下面三种操作:1.将某区间每一个数乘上x2.将某区间每一个数加上x3.求出某区间每一个数的和 本线段树的标记是个二元组:add和mul,其代表将一个线段中的每一个点 ...
- Java中需要了解的点
1.32位jvm.64位区别? 2.
- 用secureCRT ssh登陆不显示用户名和路径解决方案 分类: 软件工具学习 2015-03-18 16:52 36人阅读 评论(0) 收藏
方法1 每次开始的时候输入 bash 虽然只能保存一次,但是简便. 方法2 用 vi ~/.bash_profile 编辑这个文件, 有时会提示这个文件不存在,直 ...
- 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)
1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则) * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...
- linux初级学习笔记二:linux操作系统及常用命令,文件的创建与删除和命名规则,命令行展开以及linux中部分目录的作用!(视频序号:02_3)
本节学习的命令:tree,mkdir,rmdir,touch,stat,rm 本节学习的技能:Linux中主要的目录作用以及特殊的目录文件: 文件的命名规则,命令行展开: 文件的创建与删除: Linu ...
- Unable to instantiate receiver XXXXXX
运行一个工程的时候时logcat中出现了“Unable to instantiate receiver XX..”. 检查后发现,由于是东拼西凑的代码,所以在Manifest文件里注册了Receive ...
- CQOI2013 新数独
传送门 这道题也是很暴力的搜索啊…… 因为数独一开始全是空的,只有许许多多的大小限制条件,那也没必要纠结从哪开始搜索了,直接暴力搜索之后判断一下是否合法. 这题最恶心的是读入.现学了一招判断点在哪个块 ...