• 机房重构——泛型和“DataTable”


    前言

        我们都知道在机房重构的时候,大多数都在用七层进行重构,每一层都依赖实体。所以不管怎么调用,返回的应该是实体参数,这样才符合大多数的逻辑,这样我们试想一下,如果我们要求在U层返回多个实体值,怎么办,返回一个布尔进行B层的判断,这些问题,根据SQLHelper,增、删、改、查四条线,分为了无参和有参两种类型,查询的时候我们要求返回一个datatable,可是如果单单用这个datatable返回会不会么有实体的事情了。所以这时候泛型就出来了。在我看来它集成了所以实体的集合,方便,简单,减少内存的占用。

    泛型

    定义

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

        上面的解释是官方解释,下面是我自己的理解:

    • 泛型就是一种集合,封装了一种类型的转换,让该类型只能转换为一种类型。很好的避免了装箱和拆箱的过程。
    • 泛型是引用类型,分配到堆中,若要将值类型打包到引用类型(object)一个实例中

    不用泛型的情况:

    装箱C#版

            int i = 123;
            object obj = (object)i;//装箱


    拆箱C#版

            object obj = 123;
            int i;
            i=(int )obj;//拆箱



    使用泛型:

            IList <T >;//T为集合数据或者指定的数据类型;
            List <T>;//T为集合数据或者指定的数据类型;


        下面来说我机房重构中,怎么使用泛型的,首先要将SQLHelper中返回的DataTable转换成泛型,需要定义一个转换类,通过调用这个类来实现转换。

    ConvertList类

    Imports System.Reflection
    Module ConvertHelper
        Public Class ConvertHelper
            '将datatable转换为泛型集合
            Public Shared Function ConvertToList(Of turn As {New})(ByVal dt As DataTable) As IList(Of turn)
                '这里new是用来约束的;
    
                Dim mylist As New List(Of turn) '定义最终返回的集合
                Dim myType As Type = GetType(turn) '得到实体类的类型名
                Dim dr As DataRow '定义行集
                Dim tmpName As String = String.Empty '定义一个临时变量
    
                '遍历datatable表的所有数据行
                For Each dr In dt.Rows
                    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 (dt.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
                    mylist.Add(myturn) '添加到集合 
                Next
                Return mylist
            End Function
        End Class
    End Module


    泛型和“DataTable”转换部分:

     

    <span style="font-family:KaiTi_GB2312;font-size:18px;">
    </pre><pre code_snippet_id="1597926" snippet_file_name="blog_20160305_5_4092007" name="code" class="html">    Public Function IsExistsLogInfo(BasicInfo As Login.Entity.BasicSetEntity) As List(Of Login.Entity.BasicSetEntity) Implements IBasicSetDAL.IsExistsLogInfo
            Dim mylist1 As New List(Of Login.Entity.BasicSetEntity)
            Dim table1 As DataTable
            Dim sql As String = "Select * from TC_BasicData"
            table1 = SQLHelper.sqlhelper.ExecSelectNo(sql, CommandType.Text)
            mylist1 = ConvertHelper.ConvertHelper.ConvertToList(Of Login.Entity.BasicSetEntity)(table1)
            Return mylist1
        End Function</span>

    泛型的好处:

    1、  优于集合的使用,值类型和引用类型的转换不用进行拆装箱。

    2、  泛型在使用或者实例化的时候,指明了内部的对象类型或内部数据,避免了集合类型的不安全。

    3、  泛型在内存的处理上大于“DataTable”。

     

    小结

    1、  每一次和陌生知识的独处,都意味着一种成长。

    2、  每一次的蜕变都意味着梦想的加温。

  • 相关阅读:
    终于明白迅雷使用积分制的真正作用和目的了(教大家改迅雷)
    免费搞QQ空间
    终于明白迅雷使用积分制的真正作用和目的了(教大家改迅雷)
    终于明白迅雷使用积分制的真正作用和目的了(教大家改迅雷)
    免费搞QQ空间
    免费搞QQ空间
    如何配置Windows Live Writer
    求PI的近似值,用公式PI/4=11/3+1/51/7+...
    求31000之间的素数
    通过Office 2007发布Blog
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412423.html
Copyright © 2020-2023  润新知