zoukankan      html  css  js  c++  java
  • ConvertHelper与泛型集合

                在机房重构时。我们常常会用到ConvertHelper。

    它把从数据库中查询到的dateTable(也是一个暂时表)转化为泛型,然后再填充到DataGridView控件中。

    ConvertHelper类有两点体现了面向对象的思想。一是由于它是常常被使用而被封装起来的类。二是由于它的返回值是泛型集合,泛型集合使存储数据时灵活而安全,也体现了面向对象的思想。


    ConvertHelper与sqlHelper

               
               一開始接触ConvertHelper,以为它和sqlHelper一样,后来发现它们由于作用不同引用的命名空间不一样。

    下面是各个命名空间的含义。

            System

            包括用于定义经常使用值和引用数据类型、事件和事件处理程序、接口、属性和处理异常的基础类和基类。其它类提供支持下列操作的服务:数据类型转换,方法參数操作,数学计算,远程和本地程序调用,应用程序环境管理以及对托管和非托管应用程序的监管。

     

            System.Data

            包括组成大部分 ADO.NET 结构的类。ADO.NET 结构使您能够生成可用于有效管理来自多个数据源的数据的组件。在断开连接的方案(如 Internet)中。ADO.NET 提供了一些能够在多层系统中请求、更新和协调数据的工具。ADO.NET 结构也能够在client应用程序(如 Windows 窗口)或 ASP.NET 创建的 HTML 页中实现。

            System.Configuration 

        命名空间包括具有下面用途的类型:处理配置数据,如计算机或应用程序配置文件里的数据。子命名空间包括具有下面用途的类型:配置程序集,编写组件的自己定义安装程序。支持用于在client和server应用程序中加入或删除功能的可插入模型。

           System.Collections

           包括定义各种对象集合(如列表、队列、位数组、哈希表和字典)的接口和类。

           System.Collections.Generic

           包括定义泛型集合的接口和类;泛型集合同意用户创建强类型的集合,这样的集合在类型安全和性能上均优于非泛型强类型集合。

            ConvertHelper返回的是泛型集合。所以我们要引用System.Collections.Generic,大大提高效率和安全性能


    泛型集合


                 泛型集合在学习大话设计模式的时候接触过,这次又又一次学习了一遍。数组我们都清楚,用来实现数据的连续存储,事实上我们在用vb6敲系统时就用数组。可是数组最大的缺点就是创建时须指定数组变量的大小,在两个元素之间加入元素也比較困难。到了vs平台,就引入了集合、泛型的概念。
                 集合简言之,就是能克服上述缺点实现对数据的存储。可依据元素的多少自己主动又一次分配。后来在使用过程中。为了避免因调用数据时发生数据类型不同而导致数据库的不安全,又引入了泛型。我们的ConvertHelper类返回泛型集合,就是创建强类型的集合。


    代码

    Imports System.Collections.Generic     '加入反省集合的命名空间
    Imports System.Reflection             '加入反射的命名空间
    
    
    Public Class ConvertHelper
        '将DataTable转化为泛型集合
        Public Shared Function ConvertTolist(Of T As New)(ByVal dt As DataTable) As IList(Of T)
            Dim myList As List(Of T) = New List(Of T)()     '定义放回的集合
            Dim myType As Type = GetType(T)                 '得到实体类的类型名
            Dim tempName As String = String.Empty           '定义一个暂时变量
            Dim dr As DataRow                               '定义行集
    
    
            '遍历DataTable的全部数据行
            For Each dr In dt.Rows
                Dim myT As New T                '创建一个实体类的对象
                Dim arrayPi As PropertyInfo() = myT.GetType().GetProperties()   '定义属性集合
                Dim pi As PropertyInfo
    
                '遍历pi对象的全部属性
                For Each pi In arrayPi
                    tempName = pi.Name           '将属性名称复制给暂时变量
                    '检查DataTable是否包括此列(列名==对象的属性名)
                    If (dt.Columns.Contains(tempName)) Then              '将此属性与DataTable里的列名比較
                        '推断此属性是否有setter
                        If (pi.CanWrite = False) Then   '推断此属性是否可写。假设不可写,跳出本次循环
                            Continue For
    
                        End If
    
                        Dim value As Object = dr(tempName)  '定义一个对象型的变量来保存列的值
    
                        '假设非空。则赋给对象的属性
                        If (value.ToString() <> DBNull.Value.ToString()) Then
                            pi.SetValue(myT, value, Nothing)
                        End If
                    End If
                    
                Next
    
                myList.Add(myT)         '加入到集合
            Next
            Return myList       '返回实体集合
        End Function
    End Class




              曾经对面向对象的理解是封装、继承、多态,随着一步步的学习,我们还会了解接口、集合、泛型、托付、客套等一系列概念。它们使程序更安全、灵活……


  • 相关阅读:
    分享完整的项目工程目录结构
    2014年糯米网校
    高并发非自增ID如何设计?
    Asp.Net中使用Couchbase——Memcached缓存使用篇
    协作图(通信图)collaboration diagram
    解决java获取系统时间差8个小时 专题
    智言趣语
    Common class for judge IPV6 or IPV4
    判断参数是否符合要求的一个类
    Connection to https://dl-ssl.google.com refused的解决办法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5260481.html
Copyright © 2011-2022 走看看