首页 > 代码库 > 泛型初了解

泛型初了解

       List<T>泛型只是泛型中的一种,很多地方都可以用到泛型,dictionary、list、反射、委托……

泛型

       程序设计语言的一种特性,使得程序员在强类型程序设计语言中可以定义一些可变的部分,这些可变的部分在使用前必须做出指明,泛型实际是具有占位符的类、结构、接口、和方法。

         占位符:先占住一个固定的位置,等着你再往里面添加内容的符号

         强类型语言:不同类型之间有严格的定义,只有相同的变量才能操作。

         弱类型语言:没有明显的类型区别,各个类型之间可以自动的转换。

       在三层中师父就要求不可以将D层的传DataTable到B层或U层,一只不明白为什么现在来看一下他们有什么区别。

DataTable和List泛型集合


技术分享

DataTable是将数据库中表的数据接收保存在自己行列中,也就是说它是一个数据的集合;

List泛型集合是将数据库中的每一条记录转变为一个实体对象保存到List中,所以它是对象的集合。

将DataTable里的字段数据转换为实体中的属性值,然后添加到List泛型这个实体集中。

这样做的好处

如果是直接的将DataTable在三层之间传递数据,不符合三层要求因为三层之间只传递实体没有其他的,如果传递的是DataTable就就违背的这个要求。

下面卡代码来进一步的理解

Public Class EntityHlper
    '将DataTable里转换为List    
    ''' <summary>
    ''' 将查到的DataTable转换为List
    ''' </summary>
    ''' <typeparam name="T">参数类型,一般是和DataTable查到的结果一样</typeparam>
    ''' <param name="dt">要进行转换的DataTable表</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)  '将DataTable类型的dt转化为到List中
        ' 其中的T表示泛型,是使用时可以使用任何类型的数据型进行替换。
        '(Of T As {New})这里的new是用来约束T的必须有
        'Dim mytype As Type = GetType(T)   'GetType作用:返回指定类型的 Type 对象。 Type 对象提供有关类型的信息,如类型的属性、方法和事件。

        Dim mylist As New List(Of T) '定义一个List集合,接收DataTable的返回会结果,而List的类型就是convertToList方法传来的T参数  
        Dim dr As DataRow  '定义dr为DataTable的行    
        Dim tempName As String = String.Empty ' 定义临时变量tempName  String.Empty 表示空字符串。 此字段为只读。
        For Each dr In dt.Rows  '在表中的每一行
            Dim myT As New T
            '其中PropertyInfo作用:发现属性 (Property) 的属性 (Attribute) 并提供对属性 (Property) 元数据的访问。即获得Attribute。  property的是性质的意思,Attribute是属性的意思
            Dim propertys() As PropertyInfo = myT.GetType().GetProperties()  '得到参数传来的类型的属性并且可以访问数据的值
            'GetProperties获取当前 Type 的属性。'定义一个数组,用来存储实体的属性
            Dim pr As PropertyInfo
            '遍历取得属性的名字,然后将一行的值传到List中
            '**************************************************************************
            '这一部分读取到实体的属性,同时通过循环将需要转换的DataTable的每一条记录转换为实体,然后添加到List泛型集合中
            For Each pr In propertys
                tempName = pr.Name

                If (dt.Columns.Contains(tempName)) Then   'dt的列中如果包含指定的tempName
                    If (pr.CanWrite = False) Then  '检查获得的属性是否可写
                        Continue For  '不可以就继续循环
                    End If
                    'Dim value As Object = Trim(dr(tempName).ToString)   '将行上的某列(即某个单元格内的value)转换为字符串                  
                    Dim value As Object = dr(tempName)
                    If (value.ToString() <> DBNull.Value.ToString()) Then  '如果不是空的
                        '将myT的值设为制定的value的值,其中NOthing代表的是第三个参数应该为index但是对非索引化的属性就使用Nothing
                        pr.SetValue(myT, value, Nothing)

                    End If
                End If
            Next
            '****************************************************************************
            mylist.Add(myT)   '向List列表中添加查到的结果,添加的myT类型是前面声明的T的类型。
        Next
        Return mylist
    End Function
End Class
在D层中的调用

''' <summary>
    ''' 选择正在上线的教师,并且返回所有的结果
    ''' </summary>
    ''' <returns>返回所有的正在上机的记录</returns>
    ''' <remarks></remarks>
    Public Function SelectOnWork() As List(Of Entity.Model.WorkLogEntity) Implements IDAL.IWorkLog.SelectOnWork
        Dim dt As DataTable
        Dim sql As String
        Dim mylist As List(Of Entity.Model.WorkLogEntity) '定义一个list的类型,将T定义为工作记录的实体
        sql = "Select * from T_WorkLog where isOnWork='是' and Level='操作员'"
        dt = SQLDBHlper.GetDataTable(sql, CommandType.Text) '调用SQLHelper的方法,得到查询的所有的结果,放到dt这个DataTable中
        mylist = EntityHlper.convertToList(Of Entity.Model.WorkLogEntity)(dt) '调用convertToList方法将dt中的结果转换为List
        Return mylist
    End Function
这样就可以将在D层查到的存放在DataTable的数据转换为实体放到List集合中。



泛型初了解