《从LRS项目重构看“泛型”(四)——代码实战,将DataTable转成泛型实体集合》
来源:互联网 发布:js清空div的子元素 编辑:程序博客网 时间:2024/06/04 18:07
引言:
接上一篇文章:《从LRS项目看“泛型”(三)——刨根问底,泛型工作原理》,里面更多的是谈到了泛型的工作原理,在该系列的“泛型二”中,也看了一个简单的泛型过程的使用,相信大家也是对泛型方法有了一定的了解了。有了理论和简单的小demo之后,让咱们来一次项目实战吧!
在LRS项目的重构过程中,我们用了三层架构,为了更加符合面向对象编程又加入了Entity对象作为数据传输类(Entity类是将数据库的每一个逻辑表映射到Entity中的每一个类,当然此处要对应好数据类型,否则将在泛型转换的时候报错“类型无法转换”。具体怎么对应类型,详见另一篇博客《从LRS项目重构看“数据类型”——第一话,DataTable转换成泛型集合出现的类型冲突》)。
给每一层传输数据用。因此加入一个Entity层。应用Entity对象传输数据,充分体现了面向对象编程的一个特性——封装!但是每一个entity对象只能传输一条记录,如果我们从数据库中返回的不止一条记录的时候。而是整个DataTable呢?那么,怎么办?此时,难道你要在D层一个一个去定义不同的实体对象来返回数据吗?还是选择破坏封装性结构,直接用DataTable来传输数据呢?
咱们先看看不用泛型的情况,用实体对象返回的效果是怎样?只看D层的代码。
<span style="white-space:pre"></span>’从数据库返回DataTable dataTable = sqlHelper.ExcuteSelect(sqlString, CommandType.Text, sqlParams) Dim drow As DataRow '定义一个行集 drow = dataTable.Rows(0) '初始化行集 '逐一赋值给实体对象() eUser.userName = drow("username").ToString.Trim() eUser.userLevel = drow("userlevel").ToString.Trim() eUser.Password = drow("password").ToString.Trim() Return eUser '返回实体对象
用了泛型之后:
'通过泛型集合来实现自动赋值 Dim myList As List(Of Entity.UserInfo)
myList = Entity.EntityConvertHelper.convertToList(Of Entity.UserInfo)(dataTable)
Return myList '返回一个实体
好像还看不出来什么太大的区别。但是,请想象一下,如果此时你返回的数据中有上千个属性,那么你还要这样去手动赋值么?哦,聪明的孩纸马上想到了用循环,确实是个办法,可是不要忘记,类型冲突问题就能让你头疼上好几天的。怎么半?
别着急,好看的还在后面,你一条记录可以这样赋值,要是返回的表中有上万条记录呢?你还要这样做吗?………………?想想都要疯了……,用集合呗!哈,太聪明了!不过还是要考虑数据类型的问题啊!怎么办?
此时,你就该想到,是不是可以先不考虑类型的问题,给一个泛泛的类型呢?好了,于是天才就是这样思考问题的啦!于是,你再去看看之前之前的博客里写到的,C++模板和.net中的泛型,以及泛型的工作原理还有一个泛型方法的小demo。你会瞬间发现泛型的强大之处!(当然,这里介绍还只是冰山一角,还有泛型类,接口等……,还有更多的泛型的约束和高级应用等你来发现哦!)
附泛型方法代码一份:'************************************************* '作者:刘文彬'小组: '说明:convertToList泛型方法,将DataTable记录转成泛型实体集合'创建日期:'版本号:'*************************************************Imports System.ReflectionImports System.Collections.GenericPublic Class ConvertToListEntity ''' <summary> ''' 此处为一个泛型方法,将DataTable里面的记录 转化成泛型实体集合 ''' </summary> ''' <typeparam name="T"></typeparam> ''' <param name="dt"></param> ''' <returns></returns> ''' <remarks></remarks> Public Shared Function convertToList(Of T As New)(ByVal dt As DataTable) As IList(Of T) '注意:1、T as {new}的目的是为了约束.net中的写法,如果是c#中则用where T :new () Dim myList As New List(Of T) '定义一个最终需要返回的list 'Dim EntityType As Type = GetType(T) '得到实体的类型名 Dim dr As DataRow '定义一个行集 Dim TempName As String = String.Empty '定义一个临时变量 '遍历DataTable中所有的数据行 For Each dr In dt.Rows Dim myT As New T '定义实体对象 Dim propertys() As PropertyInfo = myT.GetType().GetProperties() '定义属性集合 Dim pr As PropertyInfo '定义一个属性对象 '遍历该实体对象中所有的属性。 For Each pr In propertys TempName = pr.Name '将属性名复制给临时变 '检查datatable中是否存在该列名(属性名=列名) If dt.Columns.Contains(TempName) Then '判断属性是否有setter If (pr.CanWrite = False) Then Continue For End If Dim value As Object = dr(TempName) '定义一个对象型的变量来存储列的值 '如果非空则赋值给对象的属性 If value.ToString.Trim <> DBNull.Value.ToString() Then pr.SetValue(myT, value, Nothing) End If End If Next myList.Add(myT) '添加到集合里面 Next Return myList '返回集合 End FunctionEnd Class
- 《从LRS项目重构看“泛型”(四)——代码实战,将DataTable转成泛型实体集合》
- 《从LRS项目重构来看“数据类型”——(第一话)DataTable转换泛型集合出现的类型冲突》
- 《从LRS项目来看”泛型“(三)——刨根问底,泛型工作原理》
- 《从LRS项目重构看如何做UI设计——组合查询的界面创意设计(一)》
- 《LRS项目重构来看"泛型"(二)——异曲同工,泛型过程和C++函数模板的比较》
- 《从LRS项目重构来看‘泛型’(一)——追根寻源,看C++中的模板技术简介》
- vb.net环境下将DataTable转成泛型集合方法
- 《从LRS项目重构来看“数据类型”——(第二话)局部类型推理(二)》
- 《从LRS项目重构来看“数据类型”——(第二话)局部类型推理(一)》
- DataTable 转成 实体
- DataTable转成List集合
- DataTable填充实体类返回泛型集合
- DataTable填充实体类返回泛型集合
- 将JSON转成DataSet(DataTable)
- ios arc (四)将mrc代码转成arc
- C#反射静态方法开发实例详解(从DataReader将数据填充到数据实体泛型集合)
- 将dataGridView数据转成DataTable
- 将dataGridView数据转成DataTable
- 题目1011:最大连续子序列 O(n)
- CocoaPods 使用手册
- Android通过Application存储应用全局变量
- Shell学习
- WD My Cloud 安装 aria2 开启远程下载
- 《从LRS项目重构看“泛型”(四)——代码实战,将DataTable转成泛型实体集合》
- java 优先队列 PriorityQueue<E>
- SCI攻略
- 第十四周 程序阅读一
- 精美UI欣赏
- 最近项目中需要在指定的字符串中取出数字字符,找了好多但都是词不达意,索性自己写了个方法,与大家共享!
- ViewController的生命周期
- 汇编语言基础1
- awk程序