菜鸟一枚,入园已有两年三个月,这还是第一次写博客,请各位大神斧正。

这是我写的一个工具类,通常我们从数据库查询到一个  DataReader  或者是  一个 Table , 想要转换成 一个 list 或者是 一个model 的话 , 一般情况下是使用foreach 循环reader或是tablerows,然后在循环内创建个对象,通过reader[“列名”]来赋值对象的属性。如果表的字段少的话,用这种方式还可以,速度也快一点。但是如果后续还会增加字段的话,那就非常麻烦了,要改很多地方。这工作量太大了,而且还很容易出错。所以这个时候使用反射来转换的话就非常便捷了。我们只管增加字段,改一下数据表对应的model,调用这个工具类的方法,传入相对应的参数就能得到想要的结果。

诶,文笔不好,直接上代码吧。

 public class DynamicGeneric
{
/// <summary>
/// table转list
/// </summary>
/// <typeparam name="T">list类型</typeparam>
/// <param name="obj">model对象</param>
/// <param name="table">数据源table</param>
/// <returns>list</returns>
public static List<T> FillListByDataTable<T>(T obj, DataTable table)
{ Type type = obj.GetType(); List<T> list = new List<T>(); PropertyInfo[] properties = type.GetProperties();//model对象的属性集合 DataColumnCollection dcc = table.Columns;//列集合 foreach (DataRow row in table.Rows)
{
//复制一个model对象
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
stream.Position = ;
T newObj = (T)formatter.Deserialize(stream); foreach (PropertyInfo pro in properties)
{
Type tp = pro.PropertyType; if (dcc.Contains(pro.Name.ToString()))
{
if (!string.IsNullOrEmpty(row[pro.Name].ToString()))
{
//判断字段类型
if (tp.Name != "Nullable`1")
{
pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], tp, null));
}
if (tp.Name != "Nullable`1")
{
pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], tp));
}
else if (tp.FullName.IndexOf("System.DateTime") > )
{
pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(DateTime), null));
}
else if (tp.FullName.IndexOf("System.Int32") > )
{
pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Int32), null));
}
else if (tp.FullName.IndexOf("System.Int64") > )
{
pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Int64), null));
}
else if (tp.FullName.IndexOf("System.Decimal") > )
{
pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Decimal), null));
}
else if (tp.FullName.IndexOf("System.Boolean") > )
{
pro.SetValue(newObj, Convert.ChangeType(row[pro.Name], typeof(Boolean), null));
}
} }
}
list.Add(newObj);
}
return list;
} /// <summary>
/// reader转list
/// </summary>
/// <typeparam name="T">list类型</typeparam>
/// <param name="obj">model对象</param>
/// <param name="reader">数据源reader</param>
/// <returns>list </returns>
public static List<T> FillListByDataReader<T>(T obj ,IDataReader reader)
{
List<T> list = new List<T>(); Type t = obj.GetType(); PropertyInfo[] proList = t.GetProperties(); while(reader.Read())
{
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
stream.Position = ;
T newObj = (T)formatter.Deserialize(stream); foreach (PropertyInfo pro in proList)
{
Type tp = pro.PropertyType; DataFieldAttribute attr = pro.GetCustomAttributes().Count() > ? pro.GetCustomAttributes().First() as DataFieldAttribute : null; if (attr != null && attr.ColumnName == pro.Name)
{
if (ReaderExists(reader, pro.Name) && !string.IsNullOrEmpty(reader[pro.Name].ToString()))
{
if (tp.Name != "Nullable`1")
{
pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], tp));
}
else if (tp.FullName.IndexOf("System.DateTime") > )
{
pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(DateTime), null));
}
else if (tp.FullName.IndexOf("System.Int32") > )
{
pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Int32), null));
}
else if (tp.FullName.IndexOf("System.Int64") > )
{
pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Int64), null));
}
else if (tp.FullName.IndexOf("System.Decimal") > )
{
pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Decimal), null));
}
else if (tp.FullName.IndexOf("System.Boolean") > )
{
pro.SetValue(newObj, Convert.ChangeType(reader[pro.Name], typeof(Boolean), null));
}
}
}
}
list.Add(newObj);
} return list;
} /// <summary>
/// reader转model对象
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="obj">model对象</param>
/// <param name="reader">数据源reader</param>
/// <returns>model对象</returns>
public static T FillObjectByDataReader<T>(T obj, IDataReader reader)
{
Type t = obj.GetType(); PropertyInfo[] proList = t.GetProperties(); if (reader.Read())
{
foreach (PropertyInfo pro in proList)
{
Type tp = pro.PropertyType; DataFieldAttribute attr = pro.GetCustomAttributes().Count() > ? pro.GetCustomAttributes().First() as DataFieldAttribute : null; if (attr != null && attr.ColumnName == pro.Name)
{
if (ReaderExists(reader, pro.Name) && !string.IsNullOrEmpty(reader[pro.Name].ToString()))
{
if (tp.Name != "Nullable`1")
{
pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], tp));
}
else if (tp.FullName.IndexOf("System.DateTime") > )
{
pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(DateTime), null));
}
else if (tp.FullName.IndexOf("System.Int32") > )
{
pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Int32), null));
}
else if (tp.FullName.IndexOf("System.Int64") > )
{
pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Int64), null));
}
else if (tp.FullName.IndexOf("System.Decimal") > )
{
pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Decimal), null));
}
else if (tp.FullName.IndexOf("System.Boolean") > )
{
pro.SetValue(obj, Convert.ChangeType(reader[pro.Name], typeof(Boolean), null));
}
}
}
}
} return obj;
} /// <summary>
/// row转model对象
/// </summary>
/// <typeparam name="T">model类型</typeparam>
/// <param name="obj">model对象</param>
/// <param name="row">数据源row</param>
/// <returns>model对象</returns>
public static T FillObjectByDataTable<T>(T obj, DataRow row)
{
Type t = obj.GetType(); PropertyInfo[] proList = t.GetProperties(); foreach (PropertyInfo pro in proList)
{
Type tp = pro.PropertyType; DataFieldAttribute attr = pro.GetCustomAttributes().Count() > ? pro.GetCustomAttributes().First() as DataFieldAttribute : null; if (attr != null && attr.ColumnName == pro.Name)
{
if (!string.IsNullOrEmpty(row[pro.Name].ToString()))
{
if (tp.Name != "Nullable`1")
{
pro.SetValue(obj, Convert.ChangeType(row[pro.Name], tp, null));
}
if (tp.Name != "Nullable`1")
{
pro.SetValue(obj, Convert.ChangeType(row[pro.Name], tp));
}
else if (tp.FullName.IndexOf("System.DateTime") > )
{
pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(DateTime), null));
}
else if (tp.FullName.IndexOf("System.Int32") > )
{
pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Int32), null));
}
else if (tp.FullName.IndexOf("System.Int64") > )
{
pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Int64), null));
}
else if (tp.FullName.IndexOf("System.Decimal") > )
{
pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Decimal), null));
}
else if (tp.FullName.IndexOf("System.Boolean") > )
{
pro.SetValue(obj, Convert.ChangeType(row[pro.Name], typeof(Boolean), null));
}
} }
} return obj;
} /// <summary>
/// list转table
/// </summary>
/// <typeparam name="T">list类型</typeparam>
/// <param name="list">数据源list</param>
/// <param name="table">table</param>
/// <returns>table</returns>
public static DataTable FillDataTableByObject<T>(List<T> list , DataTable table)
{
if (list.Count > )
{
Type type = list[].GetType(); PropertyInfo[] properties = type.GetProperties(); DataColumnCollection dcc = table.Columns; foreach (var obj in list)
{
DataRow row = table.NewRow();
foreach (PropertyInfo p in properties)
{
if (dcc.Contains(p.Name.ToString()))
{
row[p.Name] = p.GetValue(obj);
}
}
table.Rows.Add(row);
}
}
return table;
} /// <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;
} }

利用反射把查询到的Table、Reader转换成List、Model的更多相关文章

  1. C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串

    在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的 ...

  2. android 按照拼音模糊查询中如何把字符转换成拼音

    http://files.cnblogs.com/liaolandemengxiang/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9.rar 首先转换成的 ...

  3. 利用反射,泛型,静态方法快速获取表单值到Model

    在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form[&q ...

  4. SpringMVC分页查询无法直接将对象转换成json的解决办法(报org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type:错)

    在用ajax获得分页数据时,无法将获取的值赋值给input标签,在修改用户信息时不显示用户已经注册的信息,百度可知 springmvc处理分页数据返回的对象时,无法直接将对象转换成json,会报org ...

  5. python3.6 + selenium2.53.1 查询数据库并将返回的内容中每一行的内容转换成class对象

    环境: win10 python3.6 selenium2.53.1 准备工作:先安装pymysql python2.x链接数据库使用MySQLdb,而python3.x链接数据库使用pymysql ...

  6. 利用反射跟自定义注解拼接实体对象的查询SQL

    前言 项目中虽然有ORM映射框架来帮我们拼写SQL,简化开发过程,降低开发难度.但难免会出现需要自己拼写SQL的情况,这里分享一个利用反射跟自定义注解拼接实体对象的查询SQL的方法. 代码 自定义注解 ...

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

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

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

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

  9. JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...

随机推荐

  1. response常见应用、response细节、输出随机图片、定时刷新网页

      response常见应用 向客户端输出中文数据 分别以OutputStream和PrintWriter输出 多学一招:使用HTML语言里面的<meta>标签来控制浏览器行为 思考:用O ...

  2. HDU-1701 Binary Tree Traversals

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

  3. hdu 4790 Just Random (2013成都J题) 数学思路题 容斥

    题意:在[a,b]  [c,d] 之间,和模p等于m的对数 详见代码 #include <stdio.h> #include <algorithm> #include < ...

  4. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7

    性能 运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage() 操作图像数据需要遍历大量数据,应该注意几点: 1)避免在循环体中直接访问对象属性,应当保存在 ...

  5. Android游戏与应用开发最佳学习路线图

    Android 游戏与应用开发最佳学习路线图 为了帮助大家更好的学习 Android,并快速入门特此我们为大家制定了以下学习路线图,希望能够帮助大家. 一.路线图概括: 二.具体需要掌握知识点: 三. ...

  6. javascrip中array使用(续)

    ECMAScript 5中的数组的方法 Ecmascript5定义了9个新的数组方法遍历,映射,过滤,检测,简化和搜索数组. 1.forEach() Array.orEach()方法从头到尾遍历数组, ...

  7. ubuntu下安装maven

    下载maven http://maven.apache.org/download.cgi 解压 tar -xzvf apache-maven-3.0.5-bin.tar.gz 配置环境变量 sudo ...

  8. 问题-[WIN764位系统]操作UDL驱动不全处理

    http://www-01.ibm.com/support/docview.wss?uid=swg21503768 方法# 1 单击“开始——运行” 输入一个命令类似如下:        C:\Win ...

  9. AppiumLibrary实用函数介绍

    1. 点击按钮: Click Button index_or_name Click button 实例:Click Button index=0 作者通过实验发现在安卓手机应用测试中,name这个属性 ...

  10. yii2

    yii2框架官方说明文档 http://www.yiiframework.com/doc/guide/2.0/zh_cn/caching.page yii2创建您的第一个application应用 h ...