zoukankan      html  css  js  c++  java
  • 泛型集合的使用

        对于机房收费系统的重构。从大的方面来看。无非就是对于数据库的四个操作。增删改查。而且我们用的是三层架构进行重构。D层用来和数据库打交道。进行这四个操作就须要有返回值,增删改在这里不多说。可是当进行查的时候。d层须要数据给b层,那么我们以什么样的形式返回最好呢?

        刚開始接触三层的时候,我返回的是datatable,就是dt.Rows[0][“xxx”]的形式,感觉实现了。就非常厉害了,后来通过与大家交流发现,事实上另一种更好用的方法。就是利用实体类填充泛型集合。

       那么问题就出来了:

    1.泛型集合是什么?
    2.为什么说用它会更好?

    一、是什么?

        泛型,顾名思义就是泛泛的类型. 也就是没有确定的类型. 那么没有确定类型怎么使用呢?实际上。使用的时候规定类型即可了. 

        集合,就是一种处理多个数据类型的类。而且一般你会在多个应用程序中使用同一个集合的多种不同的形式。你不须要每次依据草稿建立集合,而是使用泛型建立一个泛型类原型(prototype)。

       在使用的时候,依据须要处理的数据类型。将List<T>尖括号里的T换成相应的类型,并创建相应的实例就能够使用了.

    二、为什么?

        首先。你须要给代码加入例如以下所看到的的Imports语句:

    Imports System.Collections.Generic


      加入Imports语句之后。你就能够建立泛型类了。主要的类看起来非经常见。你能够使用属性、函数、子程序、字段或能够在类中使用的其他不论什么东西。

    Public Class ConvertHelperEntity
        Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
            '将datatable 转换成泛型集合
            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
         我们须要在实体层,加入一个实体类由于创建集合的基础是要有类,然后才干将对象放入集合中。

         那么我们为什么要说它比datatable要好呢?用泛型集合,我们在D层把DataTable转换成单个实体类,再把实体类填充到泛型集合中。
         其核心思想图:


       将其优缺点进行对照可得:

    Datatable

    List<T>

    很easy写错,编译器不检查

    按一下点,自己出来。不会写错

    必须了解数据库的结构

    不必了解数据库结构

    不符合面向对象思想

    符合面向对象思想

    DataTable为弱类型。无法直观的看出字段的数据类型。

    实体类的属性是强类型,每一个字段的类型都是已知的。

           通过学习泛型集合,真正的了解了,一个程序实现功能或许不是最重要的。如何使代码最简单,易扩展,如何做到最能为他人着想,才是我们要去做的。

  • 相关阅读:
    perl dbi 控制事务
    READ-COMMITTED 不能进行可重复读和防止幻读
    REPEATABLE-READ 预读
    如何规划农商行商业智能系统中的决策分析系统?
    如何规划农商行商业智能系统中的决策分析系统?
    【MySQL】gap lock 浅析
    REPEATABLE-READ和READ-COMMITTED幻读
    ORA-01555: snapshot too old
    CXF动态客户端调用webservice实例
    mysql 区间锁
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6805108.html
Copyright © 2011-2022 走看看