前言:
在自己還沒有機房重構的時候,通過看别人的部落格,就開始初步的了解了泛型,從最開始的登入,就開始使用的泛型,直到自己做到退卡的窗體時候,發現之前的自己的泛型并不對,但是找不到錯誤的原因,後來看了一個同學的部落格,突然間有了靈感,最終的泛型應用成功。
核心:
( 一)、什麼是泛型
·泛型的參數隻可以代表類,不能代表個别對象
自己了解:是實體的集合,通過我們調試過程中,我們可以知道,泛型傳回的是實體的集合。如圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5COzkzM5UTMxAzY3QjNyQGNzYzX1EDN1cTM3EzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
(二)、泛型的優點
·處理速度快——泛型的類型屬于強類型
·代碼複用友善--在某些情況下,減少代碼的書寫量
·安全性能高——展現在泛型指定使用的類型,提供保護的類型,提高性能
(三)、泛型的應用(以機房重構基礎資料設定為例)
首先:建立泛型類
我們要使用泛型,必須先建立一個轉換的類,以我的機房為例,我将這個類建在了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>
(僅供大家參考)