用反射写自己的DataTable转为对应的Mod
之前写过类似的方法,今天做项目的时候又遇到了,以前的代码没有保存,导致又得重新写
场景:当我们定义自己的很多模型(Mods)的时候,而数据库读取出来的却是DataSet,DataTable类型的时候,我们想在界面上绑定控件的时候需要
将DataTable转为Mods
下面是我的代码,switch里面的类型判断可能不是很详细,具体的需要手动修改,加上异常,我这边测试只做了抛出....
/// <summary>
    /// 模型帮助类
    /// 主要功能:实现DataTable与Modle之间的互相转换
    /// Created by zwm 2015-11-19
    /// </summary>
    public class ModHelper
    {
        /// <summary>
        /// 将DataTable类型转为List<T>
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> DataTabelToList<T>(DataTable dt)
        {   
            List<T> list=new List<T>();
            try
            {
                if (dt == null || dt.Rows.Count <= 0)
                    return null;
Type type = typeof(T);
                System.Reflection.PropertyInfo[] properties = type.GetProperties();
                for (int i = 0; i < dt.Rows.Count;i++ )
                {
                    object obj = type.Assembly.CreateInstance(type.FullName);
                    foreach (System.Reflection.PropertyInfo property in properties)
                    {
                        if (dt.Columns.Contains(property.Name))//存在该列
                        {
if (dt.Rows[i][property.Name] == null || string.IsNullOrWhiteSpace(dt.Rows[i][property.Name].ToString()))
                            {
                                continue;
                            }
switch (property.PropertyType.Name)
                            {
                                case "String":
                                        property.SetValue(obj, dt.Rows[i][property.Name].ToString());
                                        break;
                                case "Int16":
                                        property.SetValue(obj, Convert.ToInt16(dt.Rows[i][property.Name]));
                                        break;
                                case "Int32":
                                        property.SetValue(obj, Convert.ToInt32(dt.Rows[i][property.Name]));
                                        break;
                                case "Int64":
                                        property.SetValue(obj, Convert.ToInt32(dt.Rows[i][property.Name]));
                                        break;
                                case "bool":
                                        property.SetValue(obj, Convert.ToBoolean(dt.Rows[i][property.Name]));
                                        break;
                                case "Decimal":
                                        property.SetValue(obj, Convert.ToDecimal(dt.Rows[i][property.Name]));
                                        break;
                                case "DateTime" :
property.SetValue(obj, Convert.ToDateTime(dt.Rows[i][property.Name]));
                                        break;
                                default: //有些类型需要转换
                                    Yinoer.YnCommon.Debug.WriteException(new Exception("模型转换的时候-有些类型可能需要转换!"));
                                    break;
}
                        }
                    }
                    list.Add((T)obj);
                }
                return list;
            }
            catch (Exception ex)
            {
                throw ex;//测试的时候用来抛出异常
            }
        }
用反射写自己的DataTable转为对应的Mod的更多相关文章
- .net 利用Emit将object转为DbParameter,DataTable转为List<>
		先放测试结果图,测试的方法是拷贝了老赵的一个简单的性能计数器:CodeTimer.发现速度还是比利用反射来获取快了2倍左右的,将object转为DbParameter的反射方法我没写. ... 
- 自己用反射写的一个request.getParameter工具类
		适用范围:当我们在jsp页面需要接收很多值的时候,如果用request.getParameter(属性名)一个一个写的话那就太麻烦了,于是我想是 否能用反射写个工具类来简化这样的代码,经过1个小时的代 ... 
- 应用反射写的tostring方法
		应用反射写的tostring方法 应用反射写的tostring方法,方便以后查询 代码 package com.chzhao.reflecttest; import java.lang.reflect ... 
- DataTable转List,DataTable转为Model对象帮助类
		DataTable转List,DataTable转为Model对象帮助类 public class ModelConvertHelper<T> where T : new() { publ ... 
- C#实现DataTable转为Excel文件
		实现DataTable转为Excel文件,和上次分享的Excel文件转为DataTable互为反操作.DataTable转化为Excel文件是通过传入一个DataTable类型的参数,然后将传入的Da ... 
- 反射类属性生成DataTable
		public class People //类名 { private static string name; //字段 private string sex;//字段 public string Se ... 
- 反射小应用之DataTable和List<T>互操作
		在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List&l ... 
- 用反射,将DataRow行转为Object对象
		/// <summary> /// 反射辅助类 /// </summary> public class ReflectionHelper { /// <summary&g ... 
- Silverlight中如何自己写方法将DataTable转换为PagedCollectionView数据(动态创建类)
		将DataTable转换为PagedCollectionView数据,我们可以借用DataTable的GetBindableData()方法,如下: DataTable dt=new DataTabl ... 
随机推荐
- IOS UTI统一类型标识符:判断文件类型通过后缀
			今天在学习文档和数据共享中,首先讲的处理统一类型标识符UTI.第一次见,所以记下来以备之用,首先了解UTI和MIME的概念 1.同一类型标识符(Uniform Type Identifier,UTI) ... 
- XML实例入门1
			虽然网上会有XML入门或者多少天教会XML,一般都是从普通的功能概念开始啰嗦,个人还是比较喜欢从实例开始,遇到不懂直接查(不过这次选了一个比较难得例子,研究了好久^_^).刚开始看了一个vc6.0XM ... 
- 阅读 - Code Complete 2 - 第33章 - 个人性格
			个人性格对于软件项目的开发到底有没有作用或者影响呢? 有的人急于完成自己的工作,当自己的代码遇到问题的时候,不去自己思考并调试而是直接求助于他人,有的人则是自己沉住气,耐心的从头到尾的研究找到错误的所 ... 
- 监控Informix-Url
			jdbc:informix-sqli://[{ip-address|host-name}:{port-number|service-name}][/dbname]: INFORMIXSERVER=se ... 
- DatabaseMetaData的用法(转)
			http://blog.csdn.net/sdliubo/article/details/6546889 
- VS2012生成绿色版程序的方法
			方法就是在工程属性里设置: 配置属性-〉常规-〉项目默认值-〉MFC的使用-〉在静态库中使用MFC,见下图 之后重新编译即可. 
- slave 成为master 时候执行的操作notify_master /etc/keepalived/send_master.sh
			slave:/root# cat /etc/keepalived/keepalived.conf global_defs { router_id MySQL-ha } vrrp_instance VI ... 
- android 源代码快速搜索引擎OpenCrok
			使用OpenGrok的Android系统源码搜索引擎,搜索速度简直太快速了!: http://androidxref.com/ 另外,OpenGrok的也是可以在本地计算机中安装配置的,主要是安装To ... 
- 化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件
			<化简复杂逻辑,编写紧凑的if条件语句>已经得出了跳.等.飞.异常的各自条件,方便起见这里重新贴一下. 立即跃迁:!a && b && d 等待跃迁:!a ... 
- STL中主要的算法(一)
			一.replace() 替换算法将指定元素值替换为新值,使用原型例如以下,将迭代器[first,last)中值为old_value的元素所有替换为new_value值. 函数原型: template ... 
