DataTable与List相互转换

  .NET后台数据处理,从数据库中的捞出的数据格式一般是List和DataTable的格式.现在将两种格式相互转换的心得记录下来以便以后查找(直接上代码).

public class ConvertHelper<T> where T : new()
{
  //将DataTable转换为List
  public static List<T> ConvertToList(DataTable dt)
  {
    // 定义集合
    var ls = new List<T>();
    // 获得此模型的类型
    Type type = typeof(T);
    //定义一个临时变量
    string tempName = "";
    //遍历DT数据行
    foreach (DataRow dr in dt.Rows)
    {
      T t = new T();
      //获得此模型的公共属性
      PropertyInfo[] pros = t.GetType().GetProperties();
      //遍历公共属性
      foreach (PropertyInfo p in pros)
      {
        //属性名称传给临时变量
        tempName = p.Name;
        //检查DataTable是否包含此列(列名==对象的属性名)
        if (dt.Columns.Contains(tempName))
        {
          // 判断此属性是否有Setter  
          if (!p.CanWrite) continue;//该属性不可写,直接跳出
          //取出该行该列的值
          object value = dr[tempName];  
          //如果非空,则赋给对象的属性
          if (value != DBNull.Value)
          p.SetValue(t, value, null);
        }
      }
      ls.Add(t);

   }

    return ls;
}

//获取List类型属性
public static List<PropertyInfo> GetPropertyInfo(List<T> tList)
{
  T t = new T();
  PropertyInfo[] tpro = t.GetType().GetProperties();
  return tpro.ToList();
}

//将list转换为DataTable
public static DataTable ConvertToDataTable(List<T> list)
{
  DataTable dt = new DataTable();//初始化DT
  //var arrPro = GetPropertyInfo(list);
  T t = new T();
  var arrPro = t.GetType().GetProperties();
  foreach (PropertyInfo pro in arrPro)
  {
    if (pro.CanWrite)//如果属性可以写入
    dt.Columns.Add(pro.Name, pro.Name.GetType());//DT的添加列
  }
  for (var i = 0; i < list.Count(); i++)
  {
    DataRow newDr = dt.NewRow();
    foreach (PropertyInfo p in arrPro)
    {
      if (p.CanWrite)
      newDr[p.Name] = p.GetValue(list[i]);//新行的列赋值
    }
    dt.Rows.Add(newDr);
  }
  return dt;
 }
}

DataTable和List相互转换的类的更多相关文章

  1. C# 将DataTable数据源转换成实体类

    using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...

  2. DataTable转List<Model>通用类

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  3. DataTable转List<Model>通用类【实体转换辅助类】

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  4. DataReader,DataTable利用泛型填充实体类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...

  5. C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换

    LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...

  6. JSON对象与XML相互转换工具类

    依赖jar <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId ...

  7. DataTable转List,DataTable转为Model对象帮助类

    DataTable转List,DataTable转为Model对象帮助类 public class ModelConvertHelper<T> where T : new() { publ ...

  8. (转)DataTable与结构不同实体类之间的转换

    原文地址:http://www.cnblogs.com/kinger906/p/3428855.html 在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我 ...

  9. DataTable与结构不同实体类之间的转换

    在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的 ...

随机推荐

  1. Tinyxml2学习

    转自http://www.360doc.com/content/13/1223/16/3684846_339528825.shtml,尊重原文 什么是XML? XML全称EXtensible Mark ...

  2. 【sqli-labs】 less10 GET - Blind - Time based. - Double quotes (基于时间的双引号盲注)

    这个和less9一样,单引号改完双引号就行了 http://localhost/sqli/Less-10/?id=1" and sleep(5)%23 5s后页面完成刷新 http://lo ...

  3. fileupload 上传控件

    <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:But ...

  4. Unity与Android通信的中间件

    2.1.1 Fragment和Activity都需要实现的接口——IBaseView/** * Description:Basic interface of all {@link Activity} ...

  5. Docker 导入镜像报错:open /var/lib/docker/tmp/docker-import-743441288/redis-3.0.7/json: no such file or directory

    下载好了redis的tar包,然后导入redis镜像是报错open /var/lib/docker/tmp/docker-import-743441288/redis-3.0.7/json: no s ...

  6. Socket编程(day14)

    一.基于TCP传输层的编程模型 TCP是面向连接的,安全可靠的. 三次握手 服务器端编程模型 .创建一个用于网络通讯的设备 通讯端点 socket() #include <sys/types.h ...

  7. 类型信息、异常、I/O流(day11)

    二十三 运行时的类型信息 typeid运算符 #include <typeinfo> typeid(类型/对象) )返回typeinfo的对象,用于描述类型信息. )在typeinfo类中 ...

  8. Java常量池详细说明

    java常量池技术  java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间.常量池 ...

  9. BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)

    题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...

  10. elementUI 时间选择器,时间选择快捷键

    elementUI的时间快捷键,使用属性:picker-options="pickerOptions",由于pickerOptions的定义很长,也在其他地方共用,因此建议提取出来 ...