天天看点

【一步一步了解你——泛型的应用(机房重构)】

前言:

在自己还没有机房重构的时候,通过看别人的博客,就开始初步的了解了泛型,从最开始的登录,就开始使用的泛型,直到自己做到退卡的窗体时候,发现之前的自己的泛型并不对,但是找不到错误的原因,后来看了一个同学的博客,突然间有了灵感,最终的泛型应用成功。

核心:

     ( 一)、什么是泛型

     ·泛型的参数只可以代表类,不能代表个别对象

自己理解:是实体的集合,通过我们调试过程中,我们可以知道,泛型返回的是实体的集合。如图:

【一步一步了解你——泛型的应用(机房重构)】

     (二)、泛型的优点

·处理速度快——泛型的类型属于强类型

·代码复用方便--在某些情况下,减少代码的书写量

·安全性能高——体现在泛型指定使用的类型,提供保护的类型,提高性能

     (三)、泛型的应用(以机房重构基础数据设定为例)

首先:建立泛型类

我们要使用泛型,必须先建立一个转换的类,以我的机房为例,我将这个类建在了D层下;如图

【一步一步了解你——泛型的应用(机房重构)】

其代码如下:

<span style="font-size:18px;">'**********************************************
' 文  件  名:Convert
' 命名空间:DAL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:杜娟
' 小       组:XX
' 生成日期:2016/4/27 20:52:27
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Reflection '为了使用PorpertyInfo

Public Class Convert
    '将datatable转化为泛型集合    
    Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
        '注意:convertToList(Of T As {New}) 这里的new是用来约束T的,必须有,不然new T的时候会出现错误    
        Dim myList As New List(Of T)   '定义最终返回的集合    

        Dim myTpye 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</span>      

第二:定义-转换-返回

剩下的我们就是在自己要实现功能的这个D层

1.定义一个泛型,2.添加泛型转换语句,3.最后返回泛型(注意代码中的最后三行代码)

<span style="font-size:18px;">Imports System.Data.SqlClient

'**********************************************
' 文  件  名:DBasicData
' 命名空间:DAL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:杜娟
' 小       组:XX
' 生成日期:2016/5/18 8:06:32
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class DBasicData : Implements IDAL.IBasicData
    Dim helper As New SQLhelper
    Public Function Show() As List(Of Entity.EBasicData) Implements IDAL.IBasicData.Show
        Dim Sql As String
        Dim table As New DataTable '中间变量用于存储从数据库中 查找信息
        '调用SQL语句查询
        Sql = "select * from T_BasicData"
        '调用SqlHlper类中的ExecSelect()方法来执行查询,并获取返回值
        table = helper.ExecSelectNo(Sql, CommandType.Text)
        '定义泛型
        Dim mylist As New List(Of Entity.EBasicData)
        'table 转为泛型
        mylist = Convert.convertToList(Of Entity.EBasicData)(table)
        '返回泛型
        Return mylist
    End Function
</span>      

第三,实体的建立

在转泛型的过程中,一个非常重要的环节——实体层的定义

·实体层的属性和方法的定义要和数据库中的数据类型和字段相同(这个是关键)

【一步一步了解你——泛型的应用(机房重构)】

下面是我的实体层:

<span style="font-size:18px;"> '**********************************************
' 文  件  名:EBasicData
' 命名空间:Entity
' 内       容:
' 功       能:
' 文件关系:
' 作       者:杜娟
' 小       组:XX
' 生成日期:2016/5/3 10:46:32
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class EBasicData
    Private _Rate As Integer
    Private _TmpRate As Integer
    Private _UnitTime As Integer
    Private _LimitedTime As Integer
    Private _PrepareTime As Integer
    Private _LimitedCash As Integer
    Private _Head As String

    Public Property Int_Rate() As Integer
        Get
            Return _Rate
        End Get
        Set(value As Integer)
            _Rate = value
        End Set
    End Property
    Public Property Int_TmpRate() As Integer
        Get
            Return _TmpRate
        End Get
        Set(value As Integer)
            _TmpRate = value
        End Set
    End Property
    Public Property Int_UnitTime() As Integer
        Get
            Return _UnitTime
        End Get
        Set(value As Integer)
            _UnitTime = value
        End Set
    End Property

    Public Property Int_LimitedTime() As Integer
        Get
            Return _LimitedTime
        End Get
        Set(value As Integer)
            _LimitedTime = value
        End Set
    End Property
    Public Property Int_PrepareTime() As Integer
        Get
            Return _PrepareTime
        End Get
        Set(value As Integer)
            _PrepareTime = value
        End Set
    End Property
    Public Property Int_LimitedCash() As Integer
        Get
            Return _LimitedCash
        End Get
        Set(value As Integer)
            _LimitedCash = value
        End Set
    End Property
    Public Property Chr_Head() As String
        Get
            Return _Head
        End Get
        Set(value As String)
            _Head = value
        End Set
    End Property
End Class</span>      

(仅供大家参考)

【一步一步了解你——泛型的应用(机房重构)】

总结: