反射小应用之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开发编程…

java 8 方法引用(method references)

1 什么是方法引用&#xff08;method references&#xff09;java 8 添加了一个很熟悉但是又很陌生的符号::。 你也许会看到这样的代码System.out::println其实就是方法引用&#xff08;method references&#xff09;。由于java 8 把方法/函数也作为第一输入参数。所以你会看到…

SWT中Button事件的几种不同写法

1&#xff0e;匿名内部类写法button.addSelectionListener(new SelectionAdapter(){Overridepublic void widgetSelected(SelectionEvent e){.....}});释&#xff1a;当button被单击时&#xff0c;底层就会检查button是否注册了相对就的监听器&#xff0c;如果有&#xff0c;底…

python中fetchall函数_python中查询数据库时fetchone()函数和fetchall()函数的区别

我们在用python操作数据库的时候,经常会碰见两个函数:fetchone()和fetchall()刚开始学习的时候可能会搞不清楚他们两个的区别其实非常简单首先fetchone()函数它的返回值是单个的元组,也就是一行记录,如果没有结果,那就会返回null其次是fetchall()函数,它的返回值是多个元组,即返…

文字对齐格式

text-align:justify; letter-spacing:5px; line-height:40px; text-indent:40px 转载于:https://www.cnblogs.com/mrcln/p/3757148.html

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

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

jQuery基础:remove()与 detach()区别

1、detach&#xff08;&#xff09; detach() 方法移除被选元素&#xff0c;包括所有文本和子节点。这个方法会保留 jQuery 对象中的匹配的元素&#xff0c;因而可以在将来再使用这些匹配的元素。detach() 会保留所有绑定的事件、附加的数据&#xff0c;这一点与 remove() 不同…

python保存模型 特征_Pytorch提取模型特征向量保存至csv的例子

Pytorch提取模型特征向量# -*- coding: utf-8 -*-"""dj"""import torchimport torch.nn as nnimport osfrom torchvision import models, transformsfrom torch.autograd import Variableimport numpy as npfrom PIL import Imageimport torchvi…

Matlab画图-非常具体,非常全面

Matlab画图 强大的画图功能是Matlab的特点之中的一个&#xff0c;Matlab提供了一系列的画图函数&#xff0c;用户不须要过多的考虑画图的细节&#xff0c;仅仅须要给出一些基本參数就能得到所需图形&#xff0c;这类函数称为高层画图函数。此外&#xff0c;Matlab还提供了直接对…

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

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

Oracle按用户进行统计信息更新

按用户进行统计信息更新 PL/sqldev工具使用system用户连接到oracle&#xff0c;打开命令窗口执行以下SQL&#xff0c;用户名请根据实际情况进行更改&#xff1a; begin dbms_stats.gather_schema_stats( ownname > testuser, estimate_percent > dbms_stats.aut…

个人使命宣言

最近在阅读《高效人士的7个习惯》&#xff0c;其中提到个人使命宣言&#xff0c;也就是个人的行为宪法&#xff0c;有了这个宪法我们在日常生活和工作中才能有法可循有法可依&#xff0c;才不至于在纷繁的社会中迷失自己。通过思考自我感觉制作个人使命宣言还是非常有用的&…

jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧

json&#xff1a;JavaScript 对象表示法(javascript Object Notation)&#xff0c;其实JSON就是一个javaScript的对象(Object)而已。如有不清楚JSON&#xff0c;可以去w3cschool了解http://www.w3school.com.cn/json/1.在Javascript中新建一个字符串(JSON文本)。 var txt { &q…

php中__autoload()方法详解

原文地址&#xff1a;http://www.php100.com/html/php/lei/2013/0905/5267.html[导读] PHP在魔术函数__autoload()方法出现以前&#xff0c;如果你要在一个程序文件中实例化100个对象&#xff0c;那么你必须用include或者require包含进来100个类文件&#xff0c;或者你把这100个…

python读取sql_从python读取sql的实例方法

从python读取sql的方法&#xff1a; 1、利用python内置的open函数读入sql文件&#xff1b; 2、利用第三方库pymysql中的connect函数连接mysql服务器&#xff1b; 3、利用第三方库pandas中的read_sql方法读取传入的sql文件即可。 python 直接读取 sql 文件&#xff0c;达到使用 …

我笨,但我不傻

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

GNU make manual 翻译( 一百零四)

继续翻译 4.7 Rules without Recipes or Prerequisites If a rule has no prerequisites or recipe, and the target of the rule is a nonexistent file, then make imagines this target to have been updated whenever its rule is run. This implies that all targets dep…

mysql 数字 除以 一万_腾讯股票接口、和讯网股票接口、新浪股票接口、雪球股票数据、网易股票数据...

腾讯股票接口&#xff1a;大单数据http://stock.finance.qq.com/sstock/list/view/dadan.php?tjs&csz002451&max80&p1&opt10&o0opt10 11 12 13 分别对应成交额大于等于(100万 200万 500万 1000万)opt1,2,3,4,5,6,7,8 分别对应成交量大于等于(100手 200手 …

asp.net url传值,弹窗

一,<a>标签链接式传值 1&#xff0c; <a href"News_list.aspx?ClassID<%#((DataRowView)Container.DataItem)["ClassID"]%>&Editor<%#((DataRowView)Container.DataItem)["Editor"]%>" >传值</a> 2, <a&g…

windows下python视频加速调节_Windows下python+ffmpeg实现批量提取、切割视频中的音频...

废话不说&#xff0c;直接上代码 #遍历所有mp4文件名->文件名改为字母形式->fffmpeg批量提取音频、切割音频->改回中文名 import os import subprocess current os.getcwd() dirs os.listdir(current) for i in dirs: if os.path.splitext(i)[1] ".mp4":…