泛型集合的使用

对于机房收费系统的重构。从大的方面来看。无非就是对于数据库的四个操作。增删改查。而且我们用的是三层架构进行重构。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为弱类型。无法直观的看出字段的数据类型。


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

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

时间: 2024-10-19 18:11:47

泛型集合的使用的相关文章

类库,委托,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转换成泛型集合.后来敲这个系统的时候,看到封装的类库中绝大多数的返回结果都是泛型集合.委托和

泛型学习第三天——C#读取数据库返回泛型集合 把DataSet类型转换为List&lt;T&gt;泛型集合

定义一个类: public class UserInfo    {        public System.Guid ID { get; set; } public string LoginName { get; set; } public string LoginPwd { get; set; }    } /// <summary> /// 获取UserInfo泛型集合 /// </summary> /// <param name="connStr"

三层架构下带实体参数泛型集合的“传递”

看过我的三种方法实现从"一个(组)查询过程中返回两个表的查询结果"这篇博客的同学,可能大都对最后一种方法比较感兴趣.即:把查询结果放到泛型集合中,在两个将泛型集合放入另一个新的泛型集合,新集合的参数为object.(链接:http://blog.csdn.net/u010191243/article/details/38798773) D层代码: Public Function QueryCardStudentInfo(ByVal enCard As CardEntity, ByVal