反射小应用之DataTable和ListT互操作

反射小应用之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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?

原标题&#xff1a;什么样的人比较适合选择Python开发人工智能技术&#xff1f; 互联网行业最近几年来确实成为了竞相追捧的行业&#xff0c;人工智能、大数据的不断发展让Python开发技术成为了继Java开发之后的又一热门编程语言。我们都知道&#xff0c;想要学习Python开发编程…

excel vba 从入门到精通_VBA词汇-基本元素篇

在公众号发布学习VBA需要哪些基础知识这篇文章后&#xff0c;有朋友给我们留言&#xff0c;希望可以出一份VBA基础的英语知识贴。其实相关的内容我们会在后面所对应知识点一一进行讲解&#xff0c;提前剧透其实会少很多学习未知知识的乐趣哦~ 我们会将所涉及的基础单词和其说明…

openfeign使用_Feign使用基于配置服务发现

之前写了篇《Feign在实际项目中的应用实践总结》Feign在实际项目中的应用实践总结 - 沐风之境 - 博客园​www.cnblogs.com总结了在一般项目中如何使用Feign这个提升开发效率的利器。最近在看Feign的文档的时候发现了之前遗漏的一些点&#xff0c;所以写了这篇文章进行补充。pom…

我笨,但我不傻

2019独角兽企业重金招聘Python工程师标准>>> 威哥说&#xff1a;很多朋友给我留言&#xff0c;在学习的过程中如何坚持下去&#xff0c;关于努力和目标&#xff0c;我想谈谈自己的理解&#xff0c;有不同见解的地方&#xff0c;欢迎留言跟我探讨哈。 if(努力苦逼) r…

(转)千万别熬夜:身体器官晚上工作时间表一览

原文连接&#xff1a;http://jiuyinguan.blog.163.com/blog/static/20907903720126801015713/ 任何试图更改生物钟的行为&#xff0c;都将给身体留下莫名其妙的疾病&#xff0c;20、30年之后再后悔&#xff0c;已经来不及了。 一、晚上9-11点为免疫系统&#xff08;淋巴&#x…

伯纳德•罗森伯格先生参加华为技术2016首届国际光电连接技术研讨会

近日&#xff0c;来自罗森伯格德国总部的CTO首席技术官伯纳德罗森伯格先生参加了由华为技术组织的2016首届国际光电连接技术研讨会。本届研讨会华为共邀请了来自全球的约十家著名光电技术领先厂家及合作伙伴参与&#xff0c;共同探讨未来数十年的光纤电子技术发展方向并分享最新…

如何使用python效率_Python的5中提高效率的用法

任何编程语言的高级特征通常都是通过大量的使用经验才发现的。比如你在编写一个复杂的项目&#xff0c;并在 stackoverflow 上寻找某个问题的答案。然后你突然发现了一个非常优雅的解决方案&#xff0c;它使用了你从不知道的 Python 功能&#xff01;这种学习方式太有趣了&…

Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行

&#xff08;本文是基于老版本的VS和Xamarin&#xff0c;而VS2017已经集成了Xamarin&#xff0c;所以&#xff0c;本文已经过时&#xff0c;最新的Xamarin开发介绍请参见 使用 Xamarin开发手机聊天程序 。&#xff09; 如果是.NET开发人员&#xff0c;想学习手机应用开发&#…

内网穿透 无需公网ip_无需端口映射、无需公网IP,60秒实现FTP服务远程访问

互联网的一大特点是实现信息共享&#xff0c;其中文件传输是信息共享十分重要的内容之一。科技公司更是离不开它。销售、库存、客户资料等等数据需要随时共享同步。当需要考虑到文件传输安全、传输质量、传输稳定性、访问控制等诸多因素时&#xff0c;FTP服务器就成了解决文件传…

Clojure:导入lein项目到IntelliJ IDEA

首先&#xff0c;我们需要先创建一个lein项目&#xff08;废话。。&#xff09; lein new [项目名称] 然后生成Maven的pom.xml文件 cd [项目目录]lein pom 最后&#xff0c;在InteliJ IDEA中选择导入Maven项目&#xff0c;选择刚刚生成的pom.xml文件即可。 转载于:https://www.…

git 工具_Github开源工具分享之自托管GIT服务工具Gogs

介绍Gogs项目旨在构建一种简单&#xff0c;稳定和可扩展的自托管Git服务&#xff0c;该服务可以通过最轻松的方式进行设置。使用Go语言开发的git自托管服务&#xff0c;部署十分简单&#xff0c;可以在Go支持的所有平台(包括Linux&#xff0c;macOS&#xff0c;Windows和ARM)上…

goto语句_11. Go语言流程控制:goto 无条件跳转

本文原文&#xff1a;http://golang.iswbm.comGithub&#xff1a;https://github.com/iswbm/GolangCodingTimeGo里的流程控制方法还是挺丰富&#xff0c;整理了下有如下这么多种&#xff1a;if - else 条件语句switch - case 选择语句for - range 循环语goto 无条件跳转语句def…

分页优化的四种方式

转自&#xff1a;http://www.orczhou.com/index.php/2009/03/four-way-pager-display/ 很久以前读了一篇关于分页的文章&#xff0c;后来越想越有道理&#xff0c;最近又重新找出来&#xff0c;并做了翻译&#xff0c;原文参考:Four ways to optimize paginated displays. 翻译…

使用 VMControl 2.4 实现多网络的 Power 服务器捕捉和系统部署

VMControl 作为 IBM Systems Director 的一个高级管理器&#xff0c;提供了一系列的管理功能帮助 Power 管理员快速捕获部署虚拟机系统&#xff0c;进行虚拟化环境的管理。而现代的数据中心&#xff0c;出于安全性&#xff0c;网路负载等多重因素的考虑&#xff0c;一般会存在有…

iOS应用内付费(IAP)开发步骤列表

iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起&#xff0c;完成了应用内付费&#xff08;以下简称IAP, In app purchase&#xff09;的开发工作。步骤繁多&#xff0c;在此把开发步骤列表整理如下。因为只是步骤列表&#xff0c;所以并不含详细的说明教程&#xff0c…

mysql工具的使用_产品操作MySQL入门篇-工具使用

MYSQL本资料为产品岗位作为日常工作参考&#xff0c;语言口语化At 2019/4/15 By David.Yang数据库怎么登录/管理&#xff1f;登录数据库的方式有多种&#xff0c;比如本地Client登录、通过数据库管理工具登录、通过浏览器访问数据库端WEB软件登录。通过各种方式登录后&#xff…

UIView使用UIMotionEffect效果

UIView使用UIMotionEffect效果 这个效果在模拟器上看不了,所以无法截图. UIViewMotionEffect.h UIViewMotionEffect.m // // UIViewMotionEffect.h // // Copyright (c) 2014年 Nick Jensen. All rights reserved. //#import <UIKit/UIKit.h>interface UIView (Moti…

java 观察者模式_Java技术干货分享:深入理解观察者模式原理与技术

来源&#xff1a;编程技术精选观察者模式(Observer Pattern)也叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式。这个模式的一个最重要的作用就是解耦。也就是将被观察者和观察者进行解耦&#xff0c;使得他们之间的依赖性更小&#xff0c;甚至做到毫无依赖。…

python导入pyecharts错误没有pyecharts_python报No module named 'pyecharts'的错误怎么办?

问&#xff1a;导包的时候报No module named pyecharts的错误怎么办&#xff1f;答&#xff1a;报上述错误一般是因为pyecharts这个包没有下载成功&#xff0c;下面给大家介绍一下pyecharts库的安装与使用方法&#xff01;pyecharts是Python的数据可视化库&#xff0c;可以帮助…

java .listfiles_Java File.listFiles()

全屏Java Java File.listFiles()方法具有以下语法。public File [] listFiles()示例在下面的代码显示如何使用File.listFiles()方法。import java.io.File;// At: W w W. y I i ba I.C o mpublic class Main {public static void main(String[] args) {// create new fileFile …