用反射写自己的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 ...
随机推荐
- 尼康D5100使用设置及技巧,同样也适用尼康D5200
尼康D5100使用设置及技巧,同样也适用尼康D5200,希望对新手能有点帮助. 一.设置 1.优化校准:可以在menu菜单中找到它,一般使用"标准"就可以,建议将"标准& ...
- 1501 二叉树最大宽度和高度 (BFS+树的遍历)
题目:http://www.wikioi.com/problem/1501/ 给你一颗二叉树,求该数的宽和高, 首先求出树的高,直接进行二叉树遍历,能够得到二叉树的高 然后是得到宽,本人采用的是一层一 ...
- MySQL 设置数据库的隔离级别
在会话级别设置隔离级别 1.read commited :set session transaction isolation level read committed; 2.repeatable re ...
- 深度探索QT窗口系统(五篇)
窗口作为界面编程中最重要的部分,没有窗口就没有界面,是窗口让我们摆脱了DOS时代,按钮是一个窗口,文本框是一个窗口,标签页是一个窗口,...一个窗口可以由多个窗口组成,每天我们都在与窗口打交道,当你打 ...
- 把WinXP装进内存 性能飚升秒杀固态硬盘
现在用户新配置的电脑,内存很少有小于2GB的,配置4GB内存的朋友也有不少.容量如此大的内存,我们在使用电脑的日常操作中绝对用不完.而目前制约系统性能最大的瓶颈就是硬盘的传输速度,所以,这里教你怎么把 ...
- Qt 不规则窗体的实现(构造函数里setPaletteBackgroundPixmap后设置setMask)
Skin(表皮) 是制作比较酷的软件界面的有利工具. 一个软件可以同时使用多种Skin 以取得不同的外观, 使同一个软件有截然不同的风格. 用户可以根据自己的喜好选择 不同的风格. 本节介绍使用 Qt ...
- Spring Boot的一个测试用例
package tk.mybatis.springboot.mapper; import org.junit.Assert; import org.junit.Test; import org.jun ...
- 清理8组nodes中表的历史数据,平均每个node中的表有1.5亿条记录,需要根据date_created字段清理8000W数据记录,这个字段没有索引。
清理8组nodes中表的历史数据,平均每个node中的表有1.5亿条记录,需要根据date_created字段清理8000W数据记录,这个字段没有索引. 环境介绍 线上磁盘空间不足,truncate ...
- m文件转换为C/C++文件的编译、绘图、参数、打包问题总结
在工程计算相关项目中,常常利用Matlab来完成计算.算法.绘图等功能.使用Matlab来完成这些功能非常简单,Matlab提供的m编程语言功能强大,代码量少.为了在自己的C/C++项目中加入这些功能 ...
- Android 标签控件
版本号:1.0 日期:2014.7.24 版权:© 2014 kince 转载注明出处 在有的应用中可能须要设置一些标签来方便用去去查询某些信息,比方手机助手或者购物软件之类都会有一些标签. ...