`

C# dataTable 转 IList 问题

    博客分类:
  • C#
阅读更多

大家在使用.NET开发时把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。

所以很多人都是按照以下方式做的:

// 获得查询结果
DataTable dt = DbHelper.ExecuteDataTable(...);
// 把DataTable转换为IList<UserInfo>
IList<UserInfo> users = ConvertToUserInfo(dt);

问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?
解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了。

以下是核心代码,经过测试,性能不错,大家可以根据实际情况改善


using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Reflection;

namespace Flexzoo.Data
{
/// <summary>
/// 实体转换辅助类
/// </summary>
public class ModelConvertHelper<T> where T : new()
{
public static IList<T> ConvertToModel(DataTable dt)
{
// 定义集合
IList<T> ts = new List<T>();

// 获得此模型的类型
Type type = typeof(T);

string tempName = "";

foreach (DataRow dr in dt.Rows)
{
T t = new T();

// 获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();

foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;

// 检查DataTable是否包含此列
if (dt.Columns.Contains(tempName))
{
// 判断此属性是否有Setter
if (!pi.CanWrite) continue;

object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}

ts.Add(t);
}

return ts;

}
}
}

使用方式:

// 获得查询结果
DataTable dt = DbHelper.ExecuteDataTable(...);
// 把DataTable转换为IList<UserInfo>
IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);

分享到:
评论

相关推荐

    C#实现DataTable转换成IList的方法

    本文实例讲述了C#实现DataTable转换成IList的方法。分享给大家供大家参考,具体如下: 在用C#作开发的时候经常要把DataTable转换成IList;操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的...

    DataTable和IList间转换的封装

    if (row != null) { obj = Activator.CreateInstance(); foreach (DataColumn column in row.Table.Columns) { PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName); ... object value = row...

    IList<T>转换为DataTable

    最近在项目中用到泛型接口通过反射转换为DataTable,查了些资料看到的解决方法不是太对,这里有我解决后的方法,希望对大家有帮助!

    C#实现DataTable,List和Json转换的方法

    本文实例讲述了C#实现DataTable,List和Json转换的方法。分享给大家供大家参考,具体如下: 1. 将DataTable或Ilist&lt;&gt;转换成JSON格式 using System; using System.Data; using System.Text; using System....

    c#将list类型转换成DataTable方法示例

    代码如下:///  /// 将List转换成DataTable ///  /// ”T”&gt; /// ”data”&gt; /// &lt;returns&gt;&lt;/returns&gt; public static DataTable ToDataTable(this IList&lt;T&gt; data) { PropertyDescriptorCollection prope

    C#中任意类型数据转成JSON格式

    List转成json public static string ListToJson(IList&lt;T&gt; list, string jsonName) { StringBuilder Json = new StringBuilder(); if (string.IsNullOrEmpty(jsonName)) jsonName = list[0].GetType().Name; ...

    ORM及代码生成器C#源码(2012最新版Kenly.DBFramework4.6.5.5)

    public static DataTable ToTable(IList&lt;T&gt; entities); public static DataTable ToTable(params T[] entities); public static DataTable ToTable(bool isAdapted, params T[] entities); public static ...

    ORM及代码生成器和插件C#源码(DBFrameworkV4.5.3)

    public static DataTable ToTable(IList&lt;T&gt; entities); public static DataTable ToTable(params T[] entities); public static DataTable ToTable(bool isAdapted, params T[] entities); public static ...

    DevExpress.XtraGrid.GridControl绑定List笔记

    考虑到和服务端交互数据的性能问题,在项目升级的同时,想把DataTable替换掉。 GridControl绑定IList比较简单,但是在调试主从表效果时,一直没能达到预期效果,子列表的列名一直显示相应类的字段名称。这个问题令...

    ORM及代码生成器C#源码(最新版V4.5.8.5、非常适于ASP.NET MVC)

    public static DataTable ToTable(IList&lt;T&gt; entities); public static DataTable ToTable(params T[] entities); public static DataTable ToTable(bool isAdapted, params T[] entities); public static ...

    datagridview绑定datatable数据,添加合计行,后可排序

    一个简单的datagridview绑定datatable数据,添加合计行,后可排序.

    使用泛型将数据表转换为集合

    从DataTable到T.// DataTable数组:从IListpublic静态DataTable ToDataTable(this IList iList){DataTable dataTable = new DataTable(); PropertyDescriptorCollection propertyDescriptorCollection = ...

    asp.net面试题

    dataset,datatable,dataview , IList 4.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到...

    WinForm中comboBox控件数据绑定实现方法

    下面介绍三种对comboBox绑定的方式,分别是泛型中IList和Dictionary,还有数据集DataTable  一、IList 现在我们直接创建一个List集合,然后绑定 IList&lt;string&gt; list = new List(); list.Add(111111); list.Add...

    KiteReport_20210515115933.rar

    l 报表的数据源可以使用所有的.Net数据类型,如DataSet, DataTable, ArrayList,自定义实体类等,方便和您的程序进行集成。 l 集成图片,条码等报表常用控件。 l 强大的脚本功能。脚本支持C#/VB.Net语言。有编译...

    RDLC报表自动生成器

    解决了报表定制问题,只要绑定一个DataTable或者一个IList对象就能直接显示报表,省略建立报表文件定制报表等步骤。本实例包括生成列,表格,表头等。。。,支持导出成EXCEL,因为是VS2005自带的报表组建,生成报表...

    简单的ADO.net数据访问客户端

    ITransactionKeeper同时也实现了IDisposable接口,其Dispose方法能够在事务没有提交时进行事务回滚(如果已经提交,则什么也不做),利用这个机制和C#的using语法,可以很方便的编写一个在出现异常时回滚的事务操作...

    【。net 专业】 面试题

    dataset,datatable,dataview , IList 4.概述反射和序列化 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到...

Global site tag (gtag.js) - Google Analytics