利用反射把数据库查询到的数据转换成Model、List(改良版)
之前也写过一篇这样的博文,但是非常的粗糙。 博文地址
后来看到了一位前辈(@勤快的小熊)对我的博文的评论后,让我看到了更加优雅的实现方式,于是重构了之前的代码。
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(改良版)的更多相关文章
- [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值
		
本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...
 - Java JDBC利用反射技术将查询结果封装为对象
		
1.JDBC将返回结果集封装成对象demo class JdbcDemo { /** * 获取数据库列名 * @param rs * @return */ private static String[ ...
 - 【VB.NET】利用纯真IP数据库查询IP地址及信息
		
几年前从某个博客抄来的,已经忘记原地址了,如果需要C#版的,可以在博客园搜到吧.我因为自己用,所以转换为了VBNET代码,而且也放置了很久,今天无意间翻出来,就分享给大家吧. 首先,先下载 纯真数据库 ...
 - JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)
		
ORM(Object Relational Mapping)对象关系映射 public class ORMTest { public static void main(String[] args) t ...
 - modelMapper使用,将数据库查询对象直接转成DTO对象
		
1.pom引入 <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmap ...
 - 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model
		
利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model 使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...
 - PHP将数据库的数据转换成json格式
		
header('content-type:application/json;charset=utf8'); $results = array(); while ($row = mysql_f ...
 - <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
		
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
 - 利用反射及jdbc元数据实现通用的查询方法
		
---------------------------------------------------------------------------------------------------- ...
 
随机推荐
- bzoj 3851: 2048 dp优化
			
3851: 2048 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 22 Solved: 9[Submit][Status] Description T ...
 - JENKINS里,如何为SLAVE配置多个不同的JAVA环境?
			
今天遇到这个问题了, 原来在MASTER配置里可以统一管理的,不管这个路径有没有在MASTER上. 这样一来,JENKINS在编译时,会优先选用环境变量里的JAVA版本,然后才是MAVEN里的JAVA ...
 - C++内存管理(超长,例子很详细,排版很好)
			
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
 - svn 规范apk的生成命名
			
第一步:新建SVNVersion.gradle 放置于build.gradle统计目录下面 /*task svnversion { description 'Get SVN revision num ...
 - BBC票选出的100部最经典美国电影,你看过几部?
			
BBC票选出的100部最经典美国电影,你看过几部? 导读:BBC票选出的100部最经典美国电影,你看过几部? 2015-07-27欧美内参欧美内参欧美内参 微信号zoujinoumei 功能介绍< ...
 - 一台机器上运行多个ActiveMq
			
由于业务需要一台机器上运行多个ActiveMq,这里主要说一下有什么地方不重复: 1.brokerName名称不能重复 2.端口号不能重复uri = tcp://localhost:50509 3.k ...
 - C#文本处理(String)学习笔记
			
摘要:string是编程中使用最频繁的类型.一个string表示一个恒定不变的字符序列集合.string类型直接继承自object,故他是一个引用类型,也就是说线程的堆栈上不会有任何字符串(直接继承自 ...
 - GridControl控件添加按钮列及在按钮Click事件中得到行数据 zt
			
在GridControl中添加按钮列的步骤如下: 1. 把列的ColumnEdit属性设置为RepositoryItemButtonEdit 2. 把TextEditStyle属性设置为HideTex ...
 - Climbing Worm
			
Climbing Worm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
 - Ubuntu全新系统一些配置
			
0.安装JDK,http://www.oracle.com/technetwork/java/javase/downloads/index.html 1.安装Intellij IDEA,https:/ ...