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

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

 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. xapian安装

    xapian安装:$ su enter your root password # rpm -ivh http://rpm.eprints.org/rpm-eprints-org-key-1-1.noa ...

  2. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-003-@Conditional根据条件生成bean及处理profile

    一.用@Conditional根据条件决定是否要注入bean 1. package com.habuma.restfun; public class MagicBean { } 2. package ...

  3. OA学习笔记-009-岗位管理的CRUD

    一.分析 Action->Service->Dao CRUD有功能已经抽取到BaseDaoImpl中实现,所以RoleDaoImpl没有CRUD的代码,直接从BaseDaoImpl中继承 ...

  4. POP3、SMTP和IMAP之间的区别和联系

    POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...

  5. Android 删除指定文件代码

    package com.tware.pdfdrop; import java.io.File; import android.app.Activity; import android.graphics ...

  6. 【HDOJ】1059 Dividing

    多重背包. #include <stdio.h> #include <string.h> #define mymax(a, b) (a>b) ? a:b ]; ]; vo ...

  7. 如何在windows系统自带命令查看硬件信息?

    如何在windows系统自带命令查看硬件信息? 对于在windows下查看系统信息大家一定不陌生了,我现在说几个最常用的方法,对命令感兴趣的朋友看看,(给菜鸟看的,老手就不要笑话我了,大家都是从那个时 ...

  8. BZOJ_1002_[FJOI2007]_轮状病毒_(递推+高精)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1002 )*&*(^&*^&*^**()*) 1002: [FJOI20 ...

  9. Android-获取外置SDcard路径

    Android手机支持SDcard.目前很多手机厂商把SDcard集成到手机中,当然有的手机同时也支持可插拔的SDcard.这就有了内置SDcard和位置SDcard之分.当手机同时支持内置和外置SD ...

  10. HDU-1701 Binary Tree Traversals

    http://acm.hdu.edu.cn/showproblem.php?pid=1710 已知先序和中序遍历,求后序遍历二叉树. 思路:先递归建树的过程,后后序遍历. Binary Tree Tr ...