前言:
在自己还没有机房重构的时候,通过看别人的博客,就开始初步的了解了泛型,从最开始的登录,就开始使用的泛型,直到自己做到退卡的窗体时候,发现之前的自己的泛型并不对,但是找不到错误的原因,后来看了一个同学的博客,突然间有了灵感,最终的泛型应用成功。
核心:
( 一)、什么是泛型
·具有占位符的类、结构、接口和方法
·泛型的参数只可以代表类,不能代表个别对象
自己理解:是实体的集合,通过我们调试过程中,我们可以知道,泛型返回的是实体的集合。如图:
(二)、泛型的优点
·处理速度快——泛型的类型属于强类型
·代码复用方便--在某些情况下,减少代码的书写量
·安全性能高——体现在泛型指定使用的类型,提供保护的类型,提高性能
(三)、泛型的应用(以机房重构基础数据设定为例)
首先:建立泛型类
我们要使用泛型,必须先建立一个转换的类,以我的机房为例,我将这个类建在了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>
(仅供大家参考)
总结:
学习一个新的知识,一开始不可能会全懂,只有在我们经历过错误,自己解决了问题,才是真正认识了他,了解了他,才会让我们成长!
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|