DataTable转成List

//把一个Datatable 赋值给一个List对象

//定义一个转换类

   public class ConvertTool
{
public static List<T> DataConvert<T>(DataTable tb)
{
List<T> lst = new List<T>();
DataConvert<T>(tb, ref lst);
return lst;
} public static List<T> DataConvert<T>(DataTable tb, ref List<T> lst)
{
for (int i = ; i < tb.Rows.Count; i++)
{
lst.Add(DataConvert<T>(tb.Rows[i]));
}
return lst;
}
public static T DataConvert<T>(DataRow row)
{
//泛型 根据传来的类型创建实例对象
var type = typeof(T);
object obj = type.Assembly.CreateInstance(type.FullName);
var c = (T)obj;
DataConvert(row, ref c);
return c;
}
       //获取一个类对象的所有公共属性 遍历所有属性 并赋值
         public static T DataConvert<T>(DataRow row, ref T t) {

var ps = t.GetType().GetProperties();
var tbColumns = row.Table.Columns;
foreach (var c in ps)
{
var colName = c.Name;
if (tbColumns.Contains(colName))
{
object nr = row[colName] == DBNull.Value ? null : row[colName];
if (nr == null)
{
c.SetValue(t, nr, null);
}
else
{
var nrType = c.PropertyType;
if (nrType == typeof(decimal) || nrType == typeof(decimal?))
{
nr = Convert.ToDecimal(nr);
}
else if (nrType == typeof(Int64) || nrType == typeof(Int64?))
{
nr = Convert.ToInt64(nr);
}
else if (nrType == typeof(double) || nrType == typeof(double?))
{
nr = Convert.ToDouble(nr);
}
else if (nrType == typeof(Int32) || nrType == typeof(Int32?))
{
nr = Convert.ToInt32(nr);
}
else if (nrType == typeof(Int16) || nrType == typeof(Int16?))
{
nr = Convert.ToInt16(nr);
}
c.SetValue(t, nr, null);
} }
}
return t;
}
}

定义一个测试的实体类

多种类型全部用上

   public class TestClass
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Money { get; set; }
public bool IsValid { get; set; }
public DateTime BirthDay { get; set; } }

方法调用及显示结果

 public class Program
{
static void Main(string[] args)
{
//定义一个DataTable 并赋值
DataTable dt = new DataTable("dtTest");
DataColumn dc = null;
dc = dt.Columns.Add("Id", Type.GetType("System.Int32"));
dc = dt.Columns.Add("Name", Type.GetType("System.String"));
dc = dt.Columns.Add("Money", Type.GetType("System.Decimal"));
dc = dt.Columns.Add("IsValid", Type.GetType("System.Boolean"));
dc = dt.Columns.Add("BirthDay", Type.GetType("System.DateTime"));
DataRow newRow;
newRow = dt.NewRow();
newRow["Id"] = "";
newRow["Name"] = "测试1";
newRow["IsValid"] = true;
newRow["Money"] = 100.00m;
newRow["BirthDay"] = DateTime.Now ;
dt.Rows.Add(newRow); newRow = dt.NewRow();
newRow["Id"] = "";
newRow["Name"] = "测试2";
newRow["IsValid"] = true;
newRow["Money"] = 100.00m;
newRow["BirthDay"] = DateTime.Now;
dt.Rows.Add(newRow); //调用DataTable转成List
List<TestClass> Li = ConvertTool.DataConvert<TestClass>(dt);
}
}

现在有很多流行的ORM框架,直接取出来对象数据很方便,不用再转。实现原理大同小异;

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 dataTable转换成Json格式

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

  4. 将DataTable转换成CSV文件

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

  5. C#:DataTable映射成Model

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

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

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

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

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

  8. DataTable转换成List<T>

    很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: public static class DataTableToModel { public ...

  9. C# 中DataTable转成模型List

    C# 中DataTable转成模型List 引入using System.Reflection; 命名空间 使用注意实体类的属性名必须和DataTable的列名一致 使用: DBList<Sto ...

  10. ASP.NET 将DataTable解析成JSON简介

    这里解析json使用的是Newtonsoft.Json.dll程序集.下面请看code: using System; using System.Collections.Generic; using S ...

随机推荐

  1. MDX查询SSAS结果--通过adomd.net展示到客户端

    SSAS多维模型建好之后,除了在excel客户端直接链接ssas源拖拽pivot分析使用外,还可以讲要展示的结果集通过MDX语句查询出来,嵌入到程序中,通过运行程序跑出完整的报表.如图所示:

  2. java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能

    这是java高并发系列第16篇文章. 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们 ...

  3. TensorFlow笔记-可视化Tensorboard

    可视化Tensorboard •数据序列化-events文件 TensorBoard 通过读取 TensorFlow 的事件文件来运行 •tf.summary.FileWriter('/tmp/ten ...

  4. C#编程.循环的中断

    1 循环的中断 break-立即终止循环(继续执行循环后面的第一行代码) continue-立即终止当前的循环(继续执行下一次循环) goto-可以跳出循环,到已标记好的位置上(如果希望代码易于阅读和 ...

  5. HTTP_4_返回结果的HTTP状态码

    状态码:返回请求结果. 状态码种类繁多,以下总结常用的状态码:     类别 信息性状态码 1XX 服务器接受请求,继续处理       成功状态码 200 OK 请求处理成功,并返回资源(响应报文中 ...

  6. Ubuntu下Mongo的安装和笔记

    在linux下的安装 打开https://www.mongodb.com/download-center#community选择linux然后选择自己的Version复制DOWNLOAD旁边的链接 打 ...

  7. MD、SHA、MAC消息摘要算法实现与应用

    1.消息摘要概述 消息摘要(Message Digest)又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生 ...

  8. 【iOS】删除 main.storyboard 的问题

    一直没用 main.storyboard, 后来索性把它删了,结果还出了问题: Terminating app due to uncaught exception 'NSInvalidArgument ...

  9. Mac相关快捷键操作

    拷贝: shift + option + 拖动拖动至目的地 创建快捷方式: option + command + 拖动至目的地

  10. Iterator-Java

    在Java中,Iterator的作用就是为了方便处理集合中的元素.例如获取和删除集合中的元素. 在JDK8,Iterator接口提供了如下方法: 迭代器Iterator最基本的两个方法是next()和 ...