利用反射实现DataTable 与 List<T> 转换
今天上班不太忙,就想着总结一下反射、扩展方法、以及lambda表达式的用法,自己就写了个小DEMO记录一下,希望各位大牛们看到后觉得不对的地方请及时提出。这篇文章中我只说明我的用法,作为一个备忘,基本的语法我不讲解,对这些概念不熟悉的童鞋在博客园上搜素一下,呢那个找到很多相关的讲解,小弟就先抛砖引玉了。
另附链接一枚,如果你想知道c#1.0--c#4.0 主要基础知识汇总,请猛点下面链接,你还可以看到该片文章中提到的知识点。
概述反射
- 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。
- 反射机制允许程序在执行过程中动态地添加各种功能。
详细见我的163博客.NET反射详解
扩展方法
引MSDN对扩展方法的定义: 扩展方法使你能够向现有类型“添加”方法(包括你自定义的类型和对象噢),而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但是可以像扩展类型上的实例方法一样进行调用。对于用C#编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。
lambda表达式
引百度百科对Lambda的定义“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。
说了这么多,开始上代码。
方法一:扩展方法与反射实现 DataTable 转 List<T>
public static List<T> ToList<T>(this DataTable dt) where T:class,new()
{
Type t=typeof(T);
PropertyInfo[] propertys = t.GetProperties();
List<T> lst = new List<T>();
string typeName = string.Empty; foreach (DataRow dr in dt.Rows)
{
T entity = new T();
foreach (PropertyInfo pi in propertys)
{
typeName = pi.Name;
if (dt.Columns.Contains(typeName))
{
if (!pi.CanWrite) continue;
object value = dr[typeName];
if (value == DBNull.Value) continue;
if (pi.PropertyType == typeof(string))
{
pi.SetValue(entity,value.ToString(),null);
}
else if (pi.PropertyType == typeof(int) || pi.PropertyType == typeof(int?))
{
pi.SetValue(entity,int.Parse(value.ToString()), null);
}
else if (pi.PropertyType == typeof(DateTime?) || pi.PropertyType == typeof(DateTime))
{
pi.SetValue(entity, DateTime.Parse(value.ToString()), null);
}
else if (pi.PropertyType == typeof(float))
{
pi.SetValue(entity, float.Parse(value.ToString()), null);
}
else if (pi.PropertyType == typeof(double))
{
pi.SetValue(entity, double.Parse(value.ToString()), null);
}
else
{
pi.SetValue(entity,value, null);
}
}
}
lst.Add(entity);
}
return lst;
}
方法一调用
(1)首先创建一个实体类
public class People
{
public string Name { get; set; }
public int Age{get;set;}
}
(2)调用
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Age");
DataRow dr = dt.NewRow();
dr[] = "eric";
dr[] = ;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[] = "eric1";
dr[] = ;
dt.Rows.Add(dr); List<People> p = dt.ToList<People>();
方法二:扩展方法与Action委托实现数组的遍历操作(ForEach)
public static void ForEach<T>(this IEnumerable<T> ien,Action<T> express)
{
foreach (var item in ien)
{
express(item);
} }
方法二调用
List<string> lst = new List<string>();
var arr = new string[] { "eric01", "eric02", "eric03" };
arr.ForEach(it => lst.Add(it));//这里面可以做更复杂的处理
Response.Write(lst[]);
方法三:利用方法一和方法二实现List<t>转换DataTable
public static DataTable ToDataTable<T>(this IEnumerable<T> value) where T : class,new()
{
List<PropertyInfo> lstProperty = new List<PropertyInfo>();
Type type=typeof(T);
DataTable dt = new DataTable();
type.GetProperties().ForEach(p => //ForEach扩展方法,这里使用Array.ForEach(type.GetProperties(),p=>{})也是一样
{
lstProperty.Add(p);
if (p.PropertyType.IsGenericType)//是否为泛型,泛型获取不到具体的类型
{
dt.Columns.Add(p.Name);
}
else
{
dt.Columns.Add(p.Name,p.PropertyType);
}
});
if (value != null)
{
foreach (var item in value)
{
//创建一个DataRow实例
DataRow row = dt.NewRow();
lstProperty.ForEach(p =>
{
row[p.Name] = p.GetValue(item, null);
});
dt.Rows.Add(row);
}
}
return dt;
}
OK了 今天就到此为止了,睡觉喽。每天学习一点点,每天进步一点点。
利用反射实现DataTable 与 List<T> 转换的更多相关文章
- 利用反射将Datatable、SqlDataReader转换成List模型
1. DataTable转IList public class DataTableToList<T>whereT :new() { ///<summary> ///利用反射将D ...
- 利用反射把DataTable自动赋值到Model实体(自动识别数据类型)
转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465591.html using System.Collections.Generic ...
- C# DataTable转List<T>--利用反射
/// <summary> /// 利用反射将Datatable转换为List<T>对象 /// </summary> /// <typeparam name ...
- 使用反射将DataTable的数据转成实体类
利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同) 1.利用反射把DataTable的数据写到单个实体类 /// <summary> ///利用反射把DataT ...
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
- DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)
public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...
- C#回顾 - 8.利用反射动态创建对象
拿微信消息返回的示例数据实验 var data = "<xml><ToUserName><![CDATA[toUser]]></ToUserName ...
- Python基础篇【第3篇】: Python异常处理、反射、动态导入、利用反射的web框架
异常处理 什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当P ...
随机推荐
- 【CSS】自定义checkbox样式
修改原生checkbox样式. 效果 原理 1.利用CSS3属性 appearance. 该属性(强制)更改(改变)默认(原生)样式. Firefox 支持替代的 -moz-appearance 属性 ...
- python3+scrapy 趣头条爬虫实例
项目简介 爬取趣头条新闻(http://home.qutoutiao.net/pages/home.html),具体内容: 1.列表页(json):标题,简介.封面图.来源.发布时间 2.详情页(ht ...
- linux下面重启apche 与mysql服务
1.service httpd restart 重启apache 2.service mysqld restart 重启mysql 开启与停止换成start与stop即可
- 20165213周启航java学习总结
20165213周启航java学习总结 一.每周博客链接及二维码 预备作业一:我所期望的师生关系:http://www.cnblogs.com/rocedu/p/6255835.html#WEEK15 ...
- JAVAC 命令详解
转自:http://jeffchen.iteye.com/blog/395671 结构 javac [ options ] [ sourcefiles ] [ @files ] 参数可按任意次序排列. ...
- php正则提取html图片(img)src地址与任意属性的方法
<?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/2017020716 ...
- 【APP测试(Android)】--客户端数据库
- Android 软件管理工具类Utils
Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...
- Html5与Css3知识点拾遗(六)
web字号 px() 百分比(较常用) em(最常用):一般1em=16px,相对单位.以父元素作参照系,父元素大小是不确定的 body{ font-size:100%; /*父元素默认为16px*/ ...
- 深入理解Java虚拟机二之Java内存区域与内存溢出异常
运行时数据区域 1.线程独有的内存区域 PROGRAM COUNTER REGISTER 程序计数器 程序计数器空间较小,是当前线程执行字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值 ...