【一步一步瞭解你——泛型的應用(機房重構)】
前言:
在自己還沒有機房重構的時候,通過看別人的部落格,就開始初步的瞭解了泛型,從最開始的登入,就開始使用的泛型,直到自己做到退卡的窗體時候,發現之前的自己的泛型並不對,但是找不到錯誤的原因,後來看了一個同學的部落格,突然間有了靈感,最終的泛型應用成功。
核心:
( 一)、什麼是泛型
·具有佔位符的類、結構、介面和方法
·泛型的引數只可以代表類,不能代表個別物件
自己理解:是實體的集合,通過我們除錯過程中,我們可以知道,泛型返回的是實體的集合。如圖:
(二)、泛型的優點
·處理速度快——泛型的型別屬於強型別
·程式碼複用方便--在某些情況下,減少程式碼的書寫量
·安全效能高——體現在泛型指定使用的型別,提供保護的型別,提高效能
(三)、泛型的應用(以機房重構基礎資料設定為例)
首先:建立泛型類
我們要使用泛型,必須先建立一個轉換的類,以我的機房為例,我將這個類建在了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>
(僅供大家參考)總結:
學習一個新的知識,一開始不可能會全懂,只有在我們經歷過錯誤,自己解決了問題,才是真正認識了他,瞭解了他,才會讓我們成長!
相關文章
- 帶你一步一步瞭解Python中的ClassPython
- 泛型的下一步泛型
- 一步一步帶你瞭解EventBus3.1.1 原始碼S3原始碼
- 一步一圖,帶你瞭解分散式架構的前世今生分散式架構
- Java 泛型,你瞭解型別擦除嗎?Java泛型型別
- 一步一步的瞭解webpack4的splitChunk外掛Web
- 瞭解MySQL的第一步MySql
- 一步一步構建你的網路層-TCP篇TCP
- 對find命令的進一步瞭解
- 一步一步構建你的iOS網路層 - HTTP篇iOSHTTP
- 機房重構總結
- 泛型類、泛型方法及泛型應用泛型
- 草根學Python(十四) 一步一步瞭解正規表示式Python
- Java泛型用了這麼多年,你真的瞭解嗎?Java泛型
- 融合應用11.1.8安裝,一步一步的引導
- 一步一步學DataGuard(2)基礎之術語再瞭解大概
- .net 2.0 Nullable泛型結構的應用Null泛型
- 手機應用的下一步趨勢預測
- 泛型及其應用泛型
- 一步一步搭建react應用-前後端初始化React後端
- 一步一步完成Flutter應用開發-掘金App首頁FlutterAPP
- Java反射—方法的反射、深入瞭解泛型Java反射泛型
- Android檢視狀態及重繪流程分析,帶你一步步深入瞭解View(三)AndroidView
- 一步一步帶你實現virtualdom(一)
- 一步一步理解 Java 企業級應用的可擴充套件性Java套件
- 「人臉識別」人工智慧應用最廣泛的技術,你瞭解多少?人工智慧
- 一步一步給你的 Android app 加入聊天功能AndroidAPP
- Angular 2 + 折騰記 :(10) 初步瞭解動畫,以及一步一步寫個動畫效果Angular動畫
- 你應該瞭解的 Java SPI 機制Java
- 一步一步帶你掌握webpack(一)——入門Web
- 一步一步帶你掌握webpack(二)——資產管理Web
- 一步一步帶你掌握webpack(四)——開發Web
- 一步一步完成Flutter應用開發-掘金App文章詳情完善FlutterAPP
- 一步一步將支付寶整合到 react-native 應用React
- 用了這麼多年的 Java 泛型,你對它到底有多瞭解?Java泛型
- 一步一步帶你封裝基於react的modal元件封裝React元件
- 一步一步帶你掌握webpack(三)——輸出管理Web
- Android LayoutInflater原理分析,帶你一步步深入瞭解View(一)AndroidView