对于机房收费系统的重构,从大的方面来看,无非就是对于数据库的四个操作,增删改查。并且我们用的是三层架构进行重构,D层用来和数据库打交道,进行这四个操作就需要有返回值,增删改在这里不多说,但是当进行查的时候,d层需要数据给b层,那么我们以什么样的形式返回最好呢?

    刚开始接触三层的时候,我返回的是datatable,就是dt.Rows[0][“xxx”]的形式,感觉实现了,就很厉害了,后来通过与大家交流发现,其实还有一种更好用的方法,就是利用实体类填充泛型集合。

   那么问题就出来了:

1.泛型集合是什么?
2.为什么说用它会更好?

一、是什么?

    泛型,顾名思义就是泛泛的类型. 也就是没有确定的类型. 那么没有确定类型怎么使用呢?实际上,使用的时候规定类型就行了. 

    集合,就是一种处理多个数据类型的类,并且一般你会在多个应用程序中使用同一个集合的多种不同的形式。你不需要每次根据草稿建立集合,而是使用泛型建立一个泛型类原型(prototype)。

   在使用的时候,根据需要处理的数据类型,将List<T>尖括号中的T换成对应的类型,并创建对应的实例就可以使用了.

二、为什么?

    首先,你需要给代码添加如下所示的Imports语句:


Imports System.Collections.Generic


  添加Imports语句之后,你就可以建立泛型类了。基本的类看起来很常见。你可以使用属性、函数、子程序、字段或可以在类中使用的其它任何东西。

Public Class ConvertHelperEntity
    Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
        '将datatable 转换成泛型集合
        Dim myList As New List(Of T)  '定义最终返回的集合

        Dim myType 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  '将此属性与datatable里列名相比较,查看datatable是否包含此属性

                    '判断此属性是否有setter
                    If (pr.CanWrite = False) Then   '判断此属性是否可写,如果不可写,则跳出循环
                        Continue For

                    End If
                    Dim value As Object = dr(tempName)   '定义一个对象型的变量来保存列的值

                    If (value.ToString <> DBNull.Value.ToString()) Then   '如果非空,则赋给对象的属性
                        pr.SetValue(myT, value, Nothing)   '在运行期间,通过反射,动态的访问一个对象的属性

                    End If
                End If
            Next

            myList.Add(myT)   '添加到集合
        Next
        Return myList   '返回实体集合

    End Function
End Class

     

我们需要在实体层,添加一个实体类, 因为创建集合的基础是要有类,然后才能将对象放入集合中。

     那么我们为什么要说它比datatable要好呢?用泛型集合,我们在D层把DataTable转换成单个实体类,再把实体类填充到泛型集合中。
     其核心思想图:

xlua 创建泛型 创建泛型集合_List


   将其优缺点进行对比可得:

Datatable

List<T>

非常容易写错,编译器不检查

按一下点,自己出来,不会写错

必须了解数据库的结构

不必了解数据库结构

不符合面向对象思想

符合面向对象思想

DataTable为弱类型,无法直观的看出字段的数据类型。

实体类的属性是强类型,每个字段的类型都是已知的。

  通过学习泛型集合,真正的了解了,一个程序实现功能也许不是最重要的,怎样使代码最简单,易扩展,怎样做到最能为他人着想,才是我们要去做的。