ConvertHelper与泛型集合

在机房重构时,我们经常会用到ConvertHelper。它把从数据库中查询到的dateTable(也是一个临时表)转化为泛型,然后再填充到DataGridView控件中。ConvertHelper类有两点体现了面向对象的思想。一是因为它是经常被使用而被封装起来的类;二是因为它的返回值是泛型集合,泛型集合使存储数据时灵活而安全,也体现了面向对象的思想。

ConvertHelper与sqlHelper

一开始接触ConvertHelper,以为它和sqlHelper一样,后来发现它们因为作用不同引用的命名空间不一样。以下是各个命名空间的含义。

System

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

System.Data

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

System.Configuration 命名空间包含具有以下用途的类型:处理配置数据,如计算机或应用程序配置文件中的数据。子命名空间包含具有以下用途的类型:配置程序集,编写组件的自定义安装程序,支持用于在客户端和服务器应用程序中添加或删除功能的可插入模型。

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

总结

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

时间: 2024-11-07 21:16:16

ConvertHelper与泛型集合的相关文章

使用泛型集合代替datatable作为返回值实现面向对象

开会的时候,师父说,我们在机房重构时,尽量不要用datatable作为返回值,改用泛型集合的方式,这样可以实现真正的面向对象.通过查资料和同学交流,把这个问题给解决了.对于泛型集合,我也有了一些认识. 一.对泛型集合的认识 1.存在于System.Collection,Generic的命名空间中,在用的时候,需要引用 2.泛型是具有占位符(类型参数)的类,结构,接口和方法.就是说,在泛型集合中加入的数据必须符合指定的类型<T>,否则编译时就会报错. 以上为设计模式培训实习生的内容. 那泛型集合

类库,委托,is和as运算符,泛型集合

类库:其实就是一堆类文件,只不过用户看不到这些类的源代码,保密性好. 优点:保密性好缺点:如果这个方法不好用,使用者无法自己去更改它. 类文件是.cs    类库是.dll 新建项目为类库,在debug文件夹下找到dll文件 委托:委托可以理解为:函数的指针 关键词:delegate 声明委托类型:public delegate int FirstDel(int a, int b); FirstDel不是类,是委托变量,不能实例化(不能new), 创建委托变量:FirstDel 名字 = 与这个

机房重构——泛型集合

敲三层的时候就听师傅说过泛型,只不过当时没有特别的注意.当敲用户登录窗体时,我遇到这样的问题,就是我们需要经过验证输入的信息的正误之后才能登录或者不能登录.判断时,需要返回我们从数据库中查到的信息,那么问题就来了,如何返回呢? 一开始我一直用的是DataTable返回数据的,但是当去判断的时候我不知道如何下手了,按照以往的经验,我们可以使用table.rows()或table.field(),具体的实现方法可以自己试验一下.这种方法虽然可以实现,可是里面重复的内容太多了,尤其是每次使用一个字段时

DataSet装换为泛型集合 222

#region DataSet装换为泛型集合 /// <summary> /// 利用反射和泛型 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static List<T> ConvertToList<T>(DataTable dt) { // 定义集合 List<T> ts

面向对象--类库、委托、is和as运算符、泛型集合

类库: 其实就是一堆类文件,只是看不到这些类的源代码,保密性好. 优点:保密性好 缺点:如果这个方法不好用,使用者无法自己去更改它. 给的大多是dll文件.使用方法:引用右键,添加引用,浏览,选择到相应的dll文件,确定.然后在开头加上 [using 命名空间名字] 委托: 委托可以理解为函数的指针. 关键词:delegate 声明:public delegate int FirstDel(int a, int b); 创建委托变量:FirstDel 名字 = 与这个委托类型相同的方法; 在cl

数据模型和数据访问类以及属性扩展和泛型集合

数据模型: 数据模型就是将一个表中一行的所有属性利用封装写到一个类里面,将数据表中的行数据组成一个同样结构的对象,方便使用. 1 public class Car 2 { 3 SqlConnection conn = null; 4 SqlCommand com = null; 5 public Car() 6 { 7 conn = new SqlConnection("server=.;database=ADOlianxi0425;user=sa;pwd=123;"); 8 com

C#泛型集合与非泛型集合_Felix(转自新浪博客)

在.NET FCL为我们提供了很多集合类型,是编程中非常有力的工具.泛型集合主要在System.Collections.Generic名称空间中,而非泛型集合主要在System.Collections,首先抛出结论:如果在C#2.0版本以上,尽量使用泛型集合类,而不使用非泛型集合类.因为,1.泛型编程是从c#2.0开始才被.net支持的.2.泛型集合在性能和类型安全方面优于非泛型集合. 非泛型集合-System.Collections名字空间中的类主要包括ArrayList, Hashtable

编写高质量代码改善C#程序的157个建议——建议20:使用泛型集合代替非泛型集合

建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型.很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个类的使用情况: ArrayList al=new ArrayList(); al.Add(0); al.Add(1); al.Add("mike"); foreach (var item in al) { Console.WriteLine(item); } 上面这段代码充分演

进一步对泛型集合的思考

一.前言: 经常听师哥师姐们说底层这个底层那个,从没见过这个"底层".后来师姐就在项目中应用了这个底层类库,从听说它到自己亲自用它,才发现它还真是强大的不得了啊!经常跟着师哥师姐们的课听,就是想跟这个底层混个"脸熟".我也经常是不懂装懂,其实真正听懂的也没多少啊..不仅脸熟了,还脸皮厚呢.. 言归正传为什么又提起泛型集合了呢?第一次接触是在机房重构的时候,Data Table转换成泛型集合.后来敲这个系统的时候,看到封装的类库中绝大多数的返回结果都是泛型集合.委托和