前言:
在自己还没有机房重构的时候,通过看别人的博客,就开始初步的了解了泛型,从最开始的登录,就开始使用的泛型,直到自己做到退卡的窗体时候,发现之前的自己的泛型并不对,但是找不到错误的原因,后来看了一个同学的博客,突然间有了灵感,最终的泛型应用成功。
核心:
( 一)、什么是泛型
·具有占位符的类、结构、接口和方法
·泛型的参数只可以代表类,不能代表个别对象
自己理解:是实体的集合,通过我们调试过程中,我们可以知道,泛型返回的是实体的集合。如图:
(二)、泛型的优点
·处理速度快——泛型的类型属于强类型
(三)、泛型的应用(以机房重构基础数据设定为例)
首先:建立泛型类
我们要使用泛型,必须先建立一个转换的类,以我的机房为例,我将这个类建在了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层
<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>(仅供大家参考)