反射小应用之DataTable和List<T>互操作

在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List<T>那么方便,而另外一些时候(比如使用SqlBulkCopy的时候)使用DataTable会比较方便。于是我们就会想写一个专门的它们之间的互操作来使我们在操作它们的时候变得不那么复杂。网上关于它们之间的互操作的解决方法蛮多。这里参考了下它们,结合自己实际应用,写了一个它们之间互操,代码如下:

public static class DataTableEntityInteroperate{/// <summary>/// List<T> to DataTable/// </summary>/// <typeparam name="T">Entity</typeparam>/// <param name="entities">Entities</param>/// <returns>DataTable</returns>internal static DataTable ToDataTable<T>(this List<T> entities) where T : class,new(){//IsNull returnif (null == entities || entities.Count == 0)return null;//Initial ColumnsDataTable dt = new DataTable();PropertyInfo[] pArray = typeof(T).GetProperties();try{Array.ForEach<PropertyInfo>(pArray, p =>{dt.Columns.Add(p.Name);});entities.ForEach(t =>{                   //Initial Rows                DataRow dr=dt.NewRow();int i = 0;Array.ForEach<PropertyInfo>(pArray, p =>{if (dt.Columns.Contains(p.Name))dr[i] = p.GetValue(t); //Assigned to each column
                });i++;                                dt.Rows.Add(dr);//备忘,测试不仔细。});return dt;}catch (Exception){throw;}}/// <summary>/// DataTable to Entities/// </summary>/// <typeparam name="T">Entity</typeparam>/// <param name="dt">DataTable</param>/// <returns>List<T</returns>internal static List<T> ToEntities<T>(this DataTable dt)/*必须来在于数据库来自于文件可能存在问题*/ where T : class,new(){//IsNullableif (null == dt || dt.Rows.Count == 0)return null;//Initial EntitiesList<T> entities = new List<T>();try{foreach (DataRow row in dt.Rows){PropertyInfo[] pArray = typeof(T).GetProperties();T entity = new T();Array.ForEach<PropertyInfo>(pArray, p =>{                     if(row[p.Name]!=DBNull.Value)p.SetValue(entity, row[p.Name], null);});entities.Add(entity);}return entities;}catch (Exception){throw;}}
}

关乎ToEntities扩展方法的备注:这个方法适合的是DataTable是由数据库直接返回的情况。如果DataTable数据是由Xml文件直接反序列化而来。就要在初始化DataTable时候,对DaTable的列对应在数据实体中的类型进行指定。

关于DataTable数据是直接从文件而来的备注:

public class XmlHelper
{/// <summary> /// 将XML转换为DATATABLE /// </summary> /// <param name="FileURL"></param> /// <returns></returns> public static DataTable XmlAnalysisArray(string filepath){try{DataSet ds = new DataSet();ds.ReadXml(filepath);return ds.Tables[0];}catch (Exception ex){throw ex;}}/// <summary> /// 将DATASET 转换为 XML/// </summary> /// <param name="FileURL"></param> /// <returns></returns> public static void DatasetConversionXML(DataSet ds, string FileURL){try{ds.WriteXml(FileURL);}catch (Exception ex){throw ex;}}/// <summary>/// Xml序列化/// </summary>/// <typeparam name="T">对象的类型</typeparam>/// <param name="t">序列化对象实例</param>/// <param name="filePath">文件路径</param>public static void XmlSerializer<T>(List<T> t, string filePath){XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<T>));StreamWriter writer = new StreamWriter(filePath);//将s对象写入到指定的IO流文件中try{xmlSerializer.Serialize(writer, t);}catch (Exception){//errr message
        }finally{writer.Close();}}/// <summary>/// Xml反序列化/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="t">对象实例</param>public static List<T> XmlDeserialize<T>(List<T> t, string filePath)  //必须是经过同样的过程反序列化好的文件
    {XmlSerializer mySerializer = new XmlSerializer(typeof(List<T>));FileStream myFileStream = null;if (File.Exists(filePath))  //检查文件是否存在
        {try{myFileStream = new FileStream(filePath, FileMode.Open);t = (List<T>)mySerializer.Deserialize(myFileStream);}catch (FileNotFoundException){//File not Found
            }catch (Exception){//the other error message
            }finally{myFileStream.Close();}}return t;}}

Xml文件是直接从DataTable序列化而成,而不是由List<T>序列化而来。

做如下调用则会抛出异常(异常处理已经加上,谢谢Mainz)

 var dt = XmlHelper.XmlAnalysisArray(Server.MapPath(@"XML\Students"));var list= dt.ToEntities<Student>();

调试会发现。StudentID在实体中是Int32类型。而反序列化出来的是String类型。关于此处的完美解决方案,希望大家能够指点。此处美中不足。

代码下载

posted on 2014-05-25 17:47 深谷&幽兰 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/fengchengjushi/p/3751402.html

反射小应用之DataTable和ListT互操作相关推荐

  1. DataTable 转为ListT集合

    public static List<T> HubbleTableToList<T>(this DataTable dt) where T:Class { List<T& ...

  2. DataTable转换为ListT或者DataRow转换为T

    这段时间开发ASP.NETMVC应用程序,从数据库获取数据之后,需要把记录转换为数据集在视图中显示.我们需要把DataTable转换为List<T>或者DataRow转换为T. 本篇中可以 ...

  3. Datatable转为ListT / DataRow转为实体类对象

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

  4. DataTable小详解

    DataTable小详解 DataTable小详解 基础操作 筛选DataTable数据 DataTable.Select()小详解 排序 分组 分页 去重 穿插一下LinqDynamic 利用反射 ...

  5. java的准动态(反射)

    java 的反射机制 相关系列 该懂的反射小操作 文章目录 java 的反射机制 相关系列 前言 一.反射机制 二.反射机制的常见操作 java.lang.Class 类 つづく 前言 动态语言 在程 ...

  6. 光纤连接器百科小知识

    光纤连接器,是光纤与光纤之间进行可拆卸(活动)连接的器件,它把光纤的两个端面精密对接起来,以使发射光纤输出的光能量能最大限度地耦合到接收光纤中去,并使由于其介入光链路而对系统造成的影响减到最小,这是光 ...

  7. 月黑雁飞高,反射全知道——剖析java反射机制

    文章目录 java 反射机制 反射机制概念 java反射提供的功能 反射的基本使用 反射使用步骤(获取Class对象.调用对象方法) 反射使用 例子People 获取Class的三种方法(获取一个类的 ...

  8. 视频教程-手写Java框架系列教程之一反射(含配套资料)-Java

    手写Java框架系列教程之一反射(含配套资料) 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业 ...

  9. windows 仍在设置此设备的类配置。 (代码 56)_谷歌发布Flutter Alpha:支持Windows

    老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...

最新文章

  1. 区别 eks_sport 和 exercise 有什么区别?看完你就清楚了!
  2. apk可以解压再复制到手机吗_不行了,这个打通手机和电脑的神器,必须得安利给你们...
  3. ad 原理图差分线_Altium差分线如何从原理图到PCB布线?
  4. 【效率】来了!Github 终于上线收藏夹了
  5. 【数据结构与算法】实验 构造医院的树结构
  6. VC打包程序,并修改注册表(详细以后补充)
  7. 中英文对照 —— 生活中常见词汇
  8. 无线摄像头ftp服务器设置方法,camhi摄像头怎么连接ftp服务器
  9. 60款顶级大数据开源工具
  10. 流殇三月,誓言碎落于天涯
  11. java将pdf旋转(亲测有效)
  12. java学习第七周总结
  13. 萌言萌语|测试工作日报及总结
  14. Hrbust 2294 修建传送门【思维】
  15. 计算机一直在启动界面进不去怎么办,Win7系统开机一直停留在“Windows正在启动”界面怎么办...
  16. 解决office word 2016升级后工具栏无Mathtype
  17. qt android图片自适应大小,Qt on Android:怎样适应不同的屏幕尺寸
  18. QT EXCEL 删除整行
  19. ARM体系架构—ARMv7-A指令集:协处理器指令
  20. 纯正体验,极致商务 | 丽亭酒店聚焦未来赛道,实现共赢发展

热门文章

  1. 中国首富或将易主,5500个富豪即将诞生!
  2. 这些明星日入斗金,为什么还要贷款?
  3. 为什么你总办不到大额信用卡?
  4. 可视化管理_RFID技术实施智能仓储管理可视化
  5. flutter刷新页面_用Flutter实现58App的首页
  6. java不同进程的相互唤醒_Java线程生命周期与状态切换
  7. alibab仓库 idea_01.微服务架构编码、构建
  8. python为什么虚部是j不是i_Python基础02 基本数据类型
  9. source insight 函数不能跳到definition_小技能: Windows10突然不能复制粘贴谁搞鬼
  10. sql相同顺序法和一次封锁法_数据库:事务处理