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

我是太陽啦啦啦發表於2016-05-24

前言:

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

核心:

     ( 一)、什麼是泛型

     ·具有佔位符的類、結構、介面和方法
     ·泛型的引數只可以代表類,不能代表個別物件
自己理解:是實體的集合,通過我們除錯過程中,我們可以知道,泛型返回的是實體的集合。如圖:


     (二)、泛型的優點

·處理速度快——泛型的型別屬於強型別

·程式碼複用方便--在某些情況下,減少程式碼的書寫量

·安全效能高——體現在泛型指定使用的型別,提供保護的型別,提高效能

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

首先:建立泛型類

我們要使用泛型,必須先建立一個轉換的類,以我的機房為例,我將這個類建在了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>
(僅供大家參考)


總結:

學習一個新的知識,一開始不可能會全懂,只有在我們經歷過錯誤,自己解決了問題,才是真正認識了他,瞭解了他,才會讓我們成長!

相關文章