zoukankan      html  css  js  c++  java
  • 重构——DataTable转泛型

         泛型简单介绍

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

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

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

            能够创建自己的泛型接口、泛型类、泛型方法、泛型事件、泛型托付。

         

        个人理解

            我所使用使用的泛型是一个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.Generic
    Module 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 Class
    End 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>

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

  • 相关阅读:
    Android之缩减apk大小[资源文件篇]:基于自定义Shape设置ShapeDrawable
    二叉排序树与堆的区别
    4、多用类型常量,少用#define预处理指令
    3、多用字面量语法,少用与之等价的方法
    2、在类的头文件中尽量少引入其他头文件
    1、了解Objective-C语言的起源
    iOS中date和string的转换
    OC中的抽象基类 和 接口
    Swift -- 基础部分 -- 1、常量和变量
    计算机原理简述-处理器和汇编
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7050200.html
Copyright © 2011-2022 走看看