重构——DataTable转泛型

来源:互联网 发布:关于编程的书 编辑:程序博客网 时间:2024/04/28 13:04

     泛型简介

        泛型可以最大限度的重用代码、保护类型的安全、提高性能。

        泛型最常见的用途是创建集合类

        泛型数据类型中使用的信息可在运行时通过反射获取。

        可以创建自己的泛型接口、泛型类、泛型方法、泛型事件、泛型委托。

     

    个人理解

        我所使用使用的泛型是一个list<>集合,只是集合中的每一个元素都是一个实体,而每一个实体都相当于DataTable中的一条记录。DataTable是多条记录的集合,而list<>是多个实体的集合。


    什么要转泛型?

        1、list<T>遍历方便,取到的都是单个的实体。

        2、减少输入,只需要传一个实例T就可以获取它的任何属性。

        3、正确的构建泛型类,可以减少代码中的安全问题。

        4、泛型确保了在工作量最小的情况下,为应用程序提供最佳的性能。


    泛型实例

         以充值为例,实战一下将DataTable转换为泛型,首先我们在D层创建一个类ConverHelper,用于将DataTable转换为泛型。

         

<span style="font-size:18px;"><strong>Imports System.Reflection  '引用反射Imports System.Collections.GenericModule ConverHelper    Public Class ConverHelper        Public Shared Function ConvertToList(Of T As New)(dt As DataTable, ts As IList(Of T))            '获得T的类型            Dim type As Type = GetType(T)            '定义一个临时变量            Dim strTemp As String = String.Empty            '遍历表中所有行数            For Each dr As DataRow In dt.Rows                '定义类型变量act获取动态创建对象T的类型                Dim act As T = If((Nothing Is Nothing), Activator.CreateInstance(Of T)(), Nothing)                '引用反射表示可获得对象的所有属性组成的集合                Dim propertys As PropertyInfo() = act.[GetType]().GetProperties()                '定义array变量,接收propertys中含有的属性,并提供对属性propertys元数据访问                Dim array As PropertyInfo() = propertys                Dim intCount As Integer = 0                '遍历所有对象属性                While intCount < array.Length 'length表示所有维数中元素的总和                    'pr表示元素中含有的属性,并提供对数据访问                    Dim pr As PropertyInfo = array(intCount)                    strTemp = pr.Name                    '列名=对象的属性名                    If dt.Columns.Contains(strTemp) Then                        '判断此属性是否设置函数                        If pr.CanWrite Then '该属性是否可写                            Dim value As Object = dr(strTemp)                            '如果非空,则赋值给对象的属性                            If value IsNot DBNull.Value Then                                '设置对象的属性                                pr.SetValue(act, value, Nothing)                            End If                        End If                    End If                    intCount += 1                    Continue While                End While                '添加对象到泛型集合中                ts.Add(act)            Next            Return ts        End Function    End ClassEnd Module</strong></span>


     D层中充值窗体调用这个类

 

<span style="font-size:18px;"><strong>        dt = sqlhelper.ExecSelect(str, CommandType.Text, sqlparamsnew)        If (dt.Rows.Count > 0) Then            list = ConverHelper.ConverHelper.ConvertToList(dt, list)            Return list        Else            Throw New Exception("没有记录!")        End If</strong></span>

    此时,D层的返回值类型


<span style="font-size:18px;"><strong> List(Of Entity.RechargeEntity)</strong></span>

    其实当我们接触一些新东西的时候,它可能并没有想象中的那么难,只要去做就可以了。

2 0
原创粉丝点击