标签:
在重构的过程中看到好多人都用泛型,后来觉得自己也得试试用用泛型不然没有体验怎么会知道好不好用!
关于泛型这个概念其实在看《大话设计模式》这本书的时候书中的附录提到过,但是当时好像没怎么认真理解只是知道这个名词而已。。。
泛型是具有占位符(类型参数)的类、结构、接口的方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。(摘自书中)
通过自己在重构过程的实践,感觉到泛型和DataTable相比的一些好处。
泛型它很好的维护了我们所涉及的七层结构,我们对于数据库的设计不必太清楚的知道,但是DataTable返回到U层传值时如果对数据库不了解一不小心便会传错值,这样开来是不是泛型的安全性更高。
当然在重构的过程中对于泛型的运用也只是一点点皮毛,因为我们用的是DataTable,所以需要一个转化的公共的类,就像SQLHelper一样,所以可以把它放在D层:
代码如下:
'********************************************** ' 文 件 名:ConvertHelper ' 命名空间:DAL ' 内 容: ' 功 能: ' 文件关系: ' 作 者:申明霜 ' 小 组:申明霜 ' 生成日期:2016-04-04 20:48:33 ' 版 本 号:V1.0.0.0 ' 修改日志: ' 版权说明: '********************************************** Imports System.Collections.Generic '增加泛型的命名空间 Imports System.Reflection '引入反射: Public Class ConvertHelper '将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 myType 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 ClassD层:
Public Class SqlserverBasicDataDAL : Implements IDAL.IBasicData Private sqlhelper As New SQLHelper.sqlHelper Public Function selectBD() As List(Of BasicDataEntity) Implements IBasicData.selectBD Dim sql As String Dim dt As DataTable Dim list As New List(Of Entity.BasicDataEntity) sql = "select * from T_BasicDataInfo " dt = sqlhelper.ExecSelectNo(sql, CommandType.Text) If dt.Rows.Count > 0 Then list = DAL.ConvertHelper.convertToList(Of Entity.BasicDataEntity)(dt) Return list Else Return Nothing End If End Function
标签:
原文地址:http://blog.csdn.net/sms15732621690/article/details/51347373