天天看點

【一步一步了解你——泛型的應用(機房重構)】

前言:

在自己還沒有機房重構的時候,通過看别人的部落格,就開始初步的了解了泛型,從最開始的登入,就開始使用的泛型,直到自己做到退卡的窗體時候,發現之前的自己的泛型并不對,但是找不到錯誤的原因,後來看了一個同學的部落格,突然間有了靈感,最終的泛型應用成功。

核心:

     ( 一)、什麼是泛型

     ·泛型的參數隻可以代表類,不能代表個别對象

自己了解:是實體的集合,通過我們調試過程中,我們可以知道,泛型傳回的是實體的集合。如圖:

【一步一步了解你——泛型的應用(機房重構)】

     (二)、泛型的優點

·處理速度快——泛型的類型屬于強類型

·代碼複用友善--在某些情況下,減少代碼的書寫量

·安全性能高——展現在泛型指定使用的類型,提供保護的類型,提高性能

     (三)、泛型的應用(以機房重構基礎資料設定為例)

首先:建立泛型類

我們要使用泛型,必須先建立一個轉換的類,以我的機房為例,我将這個類建在了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>      

(僅供大家參考)

【一步一步了解你——泛型的應用(機房重構)】

總結: