《从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




0 0
原创粉丝点击