【类型转换】DataTable与泛型

        在机房重构的时候我们都会将数据库的数据读取出来,经常使用的是就是DataTable数据类型,将数据库中表的信息读取出来,存在临时数据表中,即DataTable表,然后将在其他层中需要数据传参的就直接将方法定义为DataTable类型的(除非有特殊要求)。而另一种存储数据的方式就泛型集合,将DataTable转换成泛型,然后通过泛型再去传递数据。

        我从网上查了一些关于他们两个的不同:

        DataTable的数据改动需要根据数据库表中的信息操作,例如,如果我想将数据库某表的某个新字段读取出来,那么用DataTable需要重新查看数据库,然后间接就将数据库中的信息暴露了,除非是同一个人操作,不过那样岂不是不灵活了。

        同样的,问题,使用泛型集合,则不需要。 泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法存储或者使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型或其方法的参数类型出现。泛型的方法还可以将参数类型用作返回值类型或者某个形参的类型。

       但是我根据我自己的代码,表示没理解他们直接到底有什么不同,及时不用泛型,我也可以将数据源存到DataTable,然后方法返回值也定义为DataTable型也就没事了。而我用的泛型,除了将返回值方法定义为泛型,我也没有看出有什么不同,可能是我还没有发现不同吧,表示很纠结………


       如果使用了泛型,那肯定需要有DataTable转换成泛型的算法,如下:

Public Class ConvertList
        Public Shared Function ConvertToList(Of turn As {New})(ByVal table As DataTable) As List(Of turn)
            'new 用来约束
            Dim list As New List(Of turn) '定义最终返回的集合
            Dim type As Type = GetType(turn) '得到实体类的类型名
            Dim dr As DataRow '定义行数据
            Dim tmpName As String = String.Empty '定义一个临时变量

            For Each dr In table.Rows '遍历datatable表的所有数据行
                Dim myturn As New turn
                Dim propertys() As PropertyInfo = myturn.GetType().GetProperties '定义属性集合, 获得此模型的公共属性
                Dim pr As PropertyInfo  '定义属性并提供属性访问

                For Each pr In propertys '遍历该对象的所有属性
                    tmpName = pr.Name '将属性名称赋值给临时变量
                    If (table.Columns.Contains(tmpName)) Then '将此属性与datatable属性相比较,查看datatable是否包含了此属性(列名==对象的属性名) 
                        '判断是否有Setter
                        If (pr.CanWrite = False) Then  '如果该属性不可写
                            Continue For '直接跳出
                        End If

                        Dim value As Object = dr(tmpName) '定义一个对象型的变量来保存列的值
                        If (value.ToString <> DBNull.Value.ToString) Then '如果非空,则赋给对象属性
                            pr.SetValue(myturn, value, Nothing) '在运行期间通过反射,动态的访问一个对象的属性
                        End If
                    End If

                Next
                list.Add(myturn) '对象添加到泛型集合

            Next
            Return list
        End Function
    End Class



你可能感兴趣的:(算法)