机房重构之DataTable转泛型

   在重构的过程中看到好多人都用泛型,后来觉得自己也得试试用用泛型不然没有体验怎么会知道好不好用!

   关于泛型这个概念其实在看《大话设计模式》这本书的时候书中的附录提到过,但是当时好像没怎么认真理解只是知道这个名词而已。。。

   泛型是具有占位符(类型参数)的类、结构、接口的方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。(摘自书中)

   通过自己在重构过程的实践,感觉到泛型和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 Class
D层:

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


总结:虽然泛型有各种好处但是在使用的过程中要注意字段的数据类型如日期、时间等在用的过程中容易出错,另外实体中字段名字要与数据库中字段名一致!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值