写在前面

工作中经常遇到datatable与list,对于datatable而言操作起来不太方便。所以有的时候还是非常希望通过泛型集合来进行操作的。所以这里就封装了一个扩展类。也方便使用。

方法中主要使用了反射的方式动态的为属性赋值以及取值。

   public static class Extension
{
/// <summary>
/// 将datatable转换为泛型集合
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="inputDataTable"></param>
/// <returns></returns>
public static List<TEntity> ToList<TEntity>(this DataTable inputDataTable) where TEntity : class,new()
{
if (inputDataTable == null)
{
throw new ArgumentNullException("input datatable is null");
}
Type type = typeof(TEntity);
PropertyInfo[] propertyInfos = type.GetProperties();
List<TEntity> lstEntitys = new List<TEntity>();
foreach (DataRow row in inputDataTable.Rows)
{
object obj = Activator.CreateInstance(type);
foreach (PropertyInfo pro in propertyInfos)
{
foreach (DataColumn col in inputDataTable.Columns)
{
//如果直接查询的数据库,数据库是不区别大小写的,所以转换为小写忽略大小写的问题
if (col.ColumnName.ToLower().Equals(pro.Name.ToLower()))
{
//属性是否是可写的,如果是只读的属性跳过。
if (pro.CanWrite)
{
//判断类型,基本类型,如果是其他的类属性
if (pro.PropertyType == typeof(System.Int32))
{
pro.SetValue(obj, Convert.ToInt32(row[pro.Name.ToLower()]));
}
else if (pro.PropertyType == typeof(System.String))
{
pro.SetValue(obj, row[pro.Name.ToLower()].ToString());
}
else if (pro.PropertyType == typeof(System.Boolean))
{
pro.SetValue(obj, Convert.ToBoolean(row[pro.Name.ToLower()]));
}
else if (pro.PropertyType == typeof(System.DateTime))
{
pro.SetValue(obj, Convert.ToDateTime(row[pro.Name.ToLower()]));
}
else if (pro.PropertyType == typeof(System.Int64))
{
pro.SetValue(obj, Convert.ToInt64(row[pro.Name.ToLower()]));
}
else
{
pro.SetValue(obj, row[pro.Name.ToLower()]);
} }
}
}
}
TEntity tEntity = obj as TEntity;
lstEntitys.Add(tEntity);
}
return lstEntitys;
}
/// <summary>
/// 将list转换为datatable
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="inputList"></param>
/// <returns></returns>
public static DataTable ToDataTable<TEntity>(this List<TEntity> inputList) where TEntity : class,new()
{
if (inputList == null)
{
throw new ArgumentNullException("inputList");
}
DataTable dt = null;
Type type = typeof(TEntity);
if (inputList.Count == )
{
dt = new DataTable(type.Name);
return dt;
}else{dt=new DataTable();}
PropertyInfo[] propertyInfos = type.GetProperties();
foreach (var item in propertyInfos)
{
dt.Columns.Add(new DataColumn() { ColumnName = item.Name, DataType = item.PropertyType });
}
foreach (var item in inputList)
{
DataRow row = dt.NewRow();
foreach (var pro in propertyInfos)
{
row[pro.Name] = pro.GetValue(item);
}
dt.Rows.Add(row);
}
return dt;
}

总结

有些时候能偷懒就偷懒了,把常用的工具类自己封装下,下次使用的时候拿来用就可以了。

最新文章

  1. ASP.NET、JAVA跨服务器远程上传文件(图片)的相关解决方案整合
  2. 如何监控checkbox改变
  3. tarjan算法求割点cojs 8
  4. python下RSA 加密/解密,签名/验证
  5. java 用socket制作一个简易多人聊天室
  6. 【HDOJ】1239 Calling Extraterrestrial Intelligence Again
  7. hadoop集群中的日志文件
  8. zookeeper集群的python代码测试
  9. spring.net AOP配置基础
  10. linux环境下搭建环境发布web项目
  11. Express4.x API (四):Router (译)
  12. Mycat 读写分离详解
  13. android 自定义ViewGroup之浪漫求婚
  14. CentOS 7 Nginx1.12.2平滑升级到新版本nginx-1.13.3
  15. bzoj4025二分图(线段树分治 并查集)
  16. JS常见兼容性问题
  17. nginx的ip_hash负载均衡配置
  18. dotnet 命令
  19. Robot framework selenium driver download
  20. [转]SuperSocket

热门文章

  1. asp.net连接SQL SERVER 2012的方法
  2. poj 2942 Knights of the Round Table 圆桌骑士(双连通分量模板题)
  3. Heartbeat+LVS构建高可用负载均衡集群
  4. Listview的点击事件
  5. 在springmvc中使用hibernate-validate
  6. Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis
  7. Android代码优化----PullToRefresh+universal-image-loader实现从网络获取数据并刷新
  8. iOS中使用RSA对数据进行加密解密
  9. redmine Windows装配
  10. Datagrid数据导出到excel文件的三种方法