之前也写过一篇这样的博文,但是非常的粗糙。    博文地址

后来看到了一位前辈(@勤快的小熊)对我的博文的评论后,让我看到了更加优雅的实现方式,于是重构了之前的代码。

 public static List<T> ConvertToList<T>(DataTable dt)
{
List<T> list = new List<T>(); // 定义集合
Type type = typeof(T); // 获得此模型的类型
string tempName = "";
PropertyInfo[] propertys = type.GetProperties();// 获得此模型的公共属性
foreach (DataRow dr in dt.Rows)
{
//新建一个模型
object obj = type.Assembly.CreateInstance(type.FullName);
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (dt.Columns.Contains(tempName))
{
if (!pi.CanWrite) continue;
object value = dr[tempName];
if (value != DBNull.Value)
pi.SetValue(obj, value, null);
}
}
list.Add((T)obj);
}
return list;
} public static List<T> ConvertToList<T>(IDataReader reader)
{
List<T> list = new List<T>(); // 定义集合
Type type = typeof(T); // 获得此模型的类型
string tempName = "";
PropertyInfo[] propertys = type.GetProperties();// 获得此模型的公共属性
while (reader.Read())
{
//新建一个模型
object obj = type.Assembly.CreateInstance(type.FullName);
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (ReaderExists(reader, tempName))
{
if (!pi.CanWrite) continue;
object value = reader[tempName];
if (value != DBNull.Value)
pi.SetValue(obj, value, null);
}
}
list.Add((T)obj);
}
return list;
} public static T ConvertToModel<T>(IDataReader reader)
{
Type type = typeof(T);
PropertyInfo[] proList = type.GetProperties();
//新建一个模型
object obj = type.Assembly.CreateInstance(type.FullName);
string tempName = "";
if (reader.Read())
{
foreach (PropertyInfo pi in proList)
{
tempName = pi.Name;
if (ReaderExists(reader, pi.Name))
{
if (!pi.CanWrite) continue;
object value = reader[tempName];
if (value != DBNull.Value)
pi.SetValue(obj, value, null);
}
}
}
return (T)obj;
} public static T ConvertToModel<T>(DataRow row)
{
Type type = typeof(T);
PropertyInfo[] proList = type.GetProperties();
//新建一个模型
object obj = type.Assembly.CreateInstance(type.FullName);
string tempName = "";
foreach(PropertyInfo pi in proList)
{
tempName = pi.Name;
if (!string.IsNullOrEmpty(row[tempName].ToString()))
{
if (!pi.CanWrite) continue;
object value = row[tempName];
if (value != DBNull.Value)
pi.SetValue(obj, value, null);
}
}
return (T)obj;
} /// <summary>
/// 验证reader是否存在某列
/// </summary>
/// <param name="reader"></param>
/// <param name="columnName"></param>
/// <returns></returns>
private static bool ReaderExists(IDataReader reader,string columnName)
{
int count = reader.FieldCount;
for(int i = ; i < count; i++)
{
if(reader.GetName(i).Equals(columnName))
{
return true;
}
}
return false;
}

利用反射把数据库查询到的数据转换成Model、List(改良版)的更多相关文章

  1. [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值

    本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...

  2. Java JDBC利用反射技术将查询结果封装为对象

    1.JDBC将返回结果集封装成对象demo class JdbcDemo { /** * 获取数据库列名 * @param rs * @return */ private static String[ ...

  3. 【VB.NET】利用纯真IP数据库查询IP地址及信息

    几年前从某个博客抄来的,已经忘记原地址了,如果需要C#版的,可以在博客园搜到吧.我因为自己用,所以转换为了VBNET代码,而且也放置了很久,今天无意间翻出来,就分享给大家吧. 首先,先下载 纯真数据库 ...

  4. JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)

    ORM(Object Relational Mapping)对象关系映射 public class ORMTest { public static void main(String[] args) t ...

  5. modelMapper使用,将数据库查询对象直接转成DTO对象

    1.pom引入 <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmap ...

  6. 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model

    利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model   使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...

  7. PHP将数据库的数据转换成json格式

    header('content-type:application/json;charset=utf8');  $results = array();     while ($row = mysql_f ...

  8. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  9. 利用反射及jdbc元数据实现通用的查询方法

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. C#中引用(ref关键字)参数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 函数的参 ...

  2. shell 基础 $(cd `dirname $0`;pwd)

    $ cd `dirname $0` 和PWD%/* shell变量的一些特殊用法 在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的.因为他返回当前路径的"." ...

  3. DHTMLX 前端框架 建立你的一个应用程序教程(二)--设置布局

    Layout控件的演示 Dhtmlx有很多的组建来组织网页的建设, 这篇主要介绍dhtmlxLayout . 下面图片中 布局将各个组件(1.Menu 2.Toolbar 3.Grid 4.Form ...

  4. Https 原理

    HTTPS其实是有两部分组成:HTTP + SSL / TLS, 也就是在HTTP上又加了一层处理加密信息的模块.服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据 1. ...

  5. C# 判断某程序是否运行

    [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); [Dl ...

  6. VS2010中 为图片添加背景图片

    很简单的东西,嘿嘿 void CTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage( ...

  7. C# Login方法

    public static bool User_Login(string url, string uname, string password, out string[] userInfo) { st ...

  8. Web性能测试基本性能指标

    Web性能测试的部分概况一般来说,一个Web请求的处理包括以下步骤: (1)客户发送请求 (2)web server接受到请求,进行处理: (3)web server向DB获取数据: (4)webse ...

  9. 提高IIS的并发量

    IIS 7.0使用的是默认配置,服务器最多只能处理5000个同时请求. 根据相关文档调整设置,可以让服务器从设置上支持10万个同时请求 . 调整IIS 7应用程序池队列长度 由原来的默认1000改为6 ...

  10. MFC中添加OpenGL

    WINDOWS下展示OpenGL有多种形式: MFC 或 win32,该如何向MFC中添加OpenGL?下面是介绍最简单OpenGL框架. 1.首先通过VS建立MFC应用程序-MyOpenGL,选择单 ...