学习MVC的时候,使用List<T>来存储数据给前台,但是从数据库中直接读取得到的是DataTable,虽然可以直接循环DataTable来得到list,但是如果每个实体类都通过这样的得到的话,代码冗余。可以利用反射技术,写一个公共类来实现转化。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. using System.Collections;
  7. using System.Reflection;
  8. namespace DatableToList
  9. {
  10. class ConvertHelper<T> where T : new()
  11. {
  12. /// <summary>
  13. /// 利用反射和泛型
  14. /// </summary>
  15. /// <param name="dt"></param>
  16. /// <returns></returns>
  17. public static List<T> ConvertToList(DataTable dt)
  18. {
  19. // 定义集合
  20. List<T> ts = new List<T>();
  21. // 获得此模型的类型
  22. Type type = typeof(T);
  23. //定义一个临时变量
  24. string tempName = string.Empty;
  25. //遍历DataTable中所有的数据行
  26. foreach (DataRow dr in dt.Rows)
  27. {
  28. T t = new T();
  29. // 获得此模型的公共属性
  30. PropertyInfo[] propertys = t.GetType().GetProperties();
  31. //遍历该对象的所有属性
  32. foreach (PropertyInfo pi in propertys)
  33. {
  34. tempName = pi.Name;//将属性名称赋值给临时变量
  35. //检查DataTable是否包含此列(列名==对象的属性名)
  36. if (dt.Columns.Contains(tempName))
  37. {
  38. // 判断此属性是否有Setter
  39. if (!pi.CanWrite) continue;//该属性不可写,直接跳出
  40. //取值
  41. object value = dr[tempName];
  42. //如果非空,则赋给对象的属性
  43. if (value != DBNull.Value)
  44. pi.SetValue(t, value, null);
  45. }
  46. }
  47. //对象添加到泛型集合中
  48. ts.Add(t);
  49. }
  50. return ts;
  51. }
  52. }
  53. }

下面,是Main方法中调用的实例

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. using System.Collections;
  7. using System.Reflection;
  8.  
  9. namespace DatableToList
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. DataTable dt = CreateDt();//获得一个DataTable
  16. //根据对象类型和DataTable,获取泛型集合
  17. List<Person> list = ConvertHelper<Person>.ConvertToList(dt);
  18. //遍历该泛型集合,打印输出。
  19. foreach (var item in list)
  20. {
  21. Console.WriteLine(item.ToString());
  22. }
  23.  
  24. Console.ReadKey();
  25. }
  26. /// <summary>
  27. /// 创建一个DataTable,并添加数据,提供测试。
  28. /// </summary>
  29. /// <returns></returns>
  30. public static DataTable CreateDt()
  31. {
  32.  
  33. DataTable dt = new DataTable();
  34. dt.Columns.Add(new DataColumn("id", typeof(System.Int32)));
  35. dt.Columns.Add(new DataColumn("name", typeof(System.String)));
  36. dt.Columns.Add(new DataColumn("address", typeof(System.String)));
  37.  
  38. dt.Rows.Add(,"Dylan","SZ");
  39. dt.Rows.Add(, "Jay", "TW");
  40. dt.Rows.Add(, "CQ", "HK");
  41. return dt;
  42. }
  43.  
  44. }
  45.  
  46. }

实体类代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace DatableToList
  7. {
  8. class Person
  9. {
  10. private int id;
  11.  
  12. public int Id
  13. {
  14. get { return id; }
  15. set { id = value; }
  16. }
  17. private string name;
  18.  
  19. public string Name
  20. {
  21. get { return name; }
  22. set { name = value; }
  23. }
  24. private string address;
  25.  
  26. public string Address
  27. {
  28. get { return address; }
  29. set { address = value; }
  30. }
  31.  
  32. public override string ToString()
  33. {
  34. return "Person: " + id + " ," + name+","+address;
  35. }
  36. }
  37. }

本文借鉴;http://blog.csdn.net/dinglang_2009/article/details/6951138

写在自己博客里是为了好记

C#中将DataTable转成List的更多相关文章

  1. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

  2. DataTable转换成IList<T>的简单实现

    DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ...

  3. ASP.Net中实现上传过程中将文本文件转换成PDF的方法

    iTextSharp是一个常用的PDF库,我们可以使用它来创建.修改PDF文件或对PDF文件进行一些其他额外的操作.本文讲述了如何在上传过程中将文本文件转换成PDF的方法. 基本工作 在开始之前,我们 ...

  4. asp.net dataTable转换成Json格式

    /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...

  5. 将DataTable转换成CSV文件

    DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记 ...

  6. 在C#中将String转换成Enum:

    一:  在C#中将String转换成Enum: object Enum.Parse(System.Type enumType, string value, bool ignoreCase); 所以,我 ...

  7. C#:DataTable映射成Model

    这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还得自己处理. 反射自然必不可少的,另外考 ...

  8. 将DataSet(DataTable)转换成JSON格式(生成JS文件存储)

    public static string CreateJsonParameters(DataTable dt) { /**/ /**/ /**/ /* /*********************** ...

  9. C#将DataTable转换成list的方法

    本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary>   /// 酒店评论列表-分页  /// </su ...

随机推荐

  1. AppBox升级进行时 - Any与All的用法(Entity Framework)

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 属于某个角色的用户列表(Any的用法) 使用Subsonic,我们有两种方法获 ...

  2. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  3. JavaScript事件流原理解析

    一.为什么会有这一篇的文章 国庆前几天由于任务比较重,要赶在国庆前把一个进度的任务开发完成,所以也就有点赶,但是却遇到了一个比较奇怪的Bug,导致了任务比预计的延迟了几个小时,对此深表遗憾,所以利用国 ...

  4. react 和 ractive的区别

    前面进项目的时候同事说项目在用react. 我没有深究,实际中发现是ractive.js.后来发现其实另有一个react.js.和ractive.js是有区别的.不过也有相似的地方. react项目的 ...

  5. Android drawableleft drawableTop 设置图片的大小

    例子: Drawable drawable=getResources().getDrawable(R.drawable.xx); //获取图片 drawable.setBounds(left, top ...

  6. 【转】Java面试题全集2.2(上)

    146.什么是IoC和DI?DI是如何实现的? 答:IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠 ...

  7. Android基础总结(一)

    Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包,导入此包方可使用 ...

  8. Thinking in java学习笔记之迭代器

    Map<String,String> map = new HashMap<String,String>(); List list = new ArrayList(); list ...

  9. Leetcode 40. Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  10. Honeywords项目——检查密码是否被破解的一种简单方法

    Honeywords项目使用一种简单的方法来改进hash后的密码的安全性——为每个账户维护一个额外的honeywords(假密码).如果有黑客拿到了密码的文件,然后试图用brute froce的方式破 ...