/// <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# 对象复制的更多相关文章

  1. PHP基础知识之对象复制

    对象的复制默认为浅复制 进行深复制的方法为:在类中定义魔法方法__clone(),类的对象复制时,会自动调用 __clone方法,在 __clone方法中可以进行各种复制对象的个性化 class My ...

  2. JS对象复制

    在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...

  3. PHP写时复制, 变量复制和对象复制不同!!!

    2016年3月18日 15:09:28 星期五 一直以为PHP对象也是写时复制....... 其实: PHP的变量是写时复制, 对象是引用的 写时复制: $a = $b; 如果$b的内容不改变, $a ...

  4. 【转】JavaScript中的对象复制(Object Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...

  5. 对象复制、克隆、深度clone

    -------------------------------------------------------------------------------- ------------------- ...

  6. PHP5的对象复制

    今天用yii开发程序,一个bug改了一晚上,最后发现问题出在了对象复制机制上,PHP5之前的对象复制只需要$object_a = $object_b即可,但PHP5这样得到的是浅复制,及指针指向,并不 ...

  7. Java反射 - 2(对象复制,父类域,内省)

    为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...

  8. js原生设计模式——7原型模式之真正的原型模式——对象复制封装

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  9. JS对象复制(深拷贝、浅拷贝)

    如何在 JS 中复制对象 在本文中,我们将从浅拷贝(shallow copy)和深拷贝(deep copy)两个方面,介绍多种 JS 中复制对象的方法. 在开始之前,有一些基础知识值得一提:Javas ...

  10. JavaScript对象复制(一)(转载)

    在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...

随机推荐

  1. unity 3D Mesh网络模型,怎样将Constructer拖入场景??

    下图中的将Constructer拖入场景,怎么拖入,不知道... 1.Constructer是一个什么东西?在 下图中没有看到这个名字的,于是乎,我就不知道该怎么办了...

  2. webservice client setTimeOut

    一:eclipse生成的client,基于axis client_sub.getOptions().setTimeOutInMilliSeconds(1000*60); client_sub表示一个客 ...

  3. HDFS运维和优化

    常见问题 下面列举HDFS运行过程中可能出现的常见问题及解决方法,这些问题一般都会在日志中出现的相应的记录.Incompatible clusterIDs in … :namenode cluster ...

  4. Tomcat启动报:invalid LOC header (bad signature)的问题

    原因:这种一般是因为项目依赖的某个jar包损坏引起的, 解决办法: 1.右键项目,选择maven,更新(update maven project) 2.通过右击项目名 ->  Run as -& ...

  5. react native 中的redux

    一.使用redux 的条件: 1.某个组件的状态,需要共享: 2.某个状态需要在任何地方都可以拿到: 3.一个组件需要改变全局状态: 4.一个组件需要改变另一个组件的状态. redux   说明白点, ...

  6. Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.st.mapper.UserMapper.userBaseMap

    mybatis出现此异常,可能是因为 ***Mapper.xml 文件中存在重名对象,一不小心重复启动了mybatis的逆向工程. 以为会覆盖掉以前生成的,没想到是新生成的和之前生成的重复了 解决:把 ...

  7. ZOJ 3706 Break Standard Weight 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009 题目意思:给出两个mass:x 和 y,问如何将其中一个 ma ...

  8. (转)Linux下 SVN客户端安装

    原地址:http://rtxbc.iteye.com/blog/860092 今天有现场程序连svn服务器一直有异常,于是在现场linux下安装svn client来直接测试,看问题原因: 一:安装s ...

  9. 设置Tomcat的jvm内存问题

    tomcat的jvm大小设置与操作系统以及jdk有关:具体来说: 1.操作系统是32bit的,程序最大内存访问空间是4G, 2的32次方,这是硬件决定的,跟windows linux没有任何关系. 2 ...

  10. 使用cocoaPods加载框架的具体步骤:

    注意事项: 1.使用之前备份一下代码.因为pod更新很快,如果某个文件名有中文,pod install 一下.整个项目可能就要废掉了. 2.如果不把pod文件推动到远程服务器. 每一次用的时候在本地p ...