开会的时候,师父说。我们在机房重构时,尽量不要用datatable作为返回值。改用泛型集合的方式,这样能够实现真正的面向对象。

通过查资料和同学交流,把这个问题给攻克了。

对于泛型集合。我也有了一些认识。

一、对泛型集合的认识

1.存在于System.Collection,Generic的命名空间中,在用的时候。须要引用

2.泛型是具有占位符(类型參数)的类,结构,接口和方法。就是说,在泛型集合中增加的数据必须符合指定的类型<T>,否则编译时就会报错。

以上为设计模式培训实习生的内容。

那泛型集合与datatable相比,究竟有什么长处呢?

1.datatable在使用时,须要了解数据库的结构,比方。我们想要获得某个字段的值,就必须知道它在数据表中的第几个字段。datatable.rows(1).Item(2)等。可是。使用泛型集合则不用,比方想要获得用户的username,则能够直接写mylist.Item(0).UserName.这里Item指你要获得的第几个实体

2.假设有成千上万条数据,datatable会出现意想不到的麻烦。但是,利用泛型则能够使用循环语句。自己主动获得数据。

for i=0 to mylist.count-1 ,极大地方便了编程人员

3.泛型符合面向对象的思想 。

泛型集合中将每一条数据当成了一个实体来对待,而每一个字段则当成该实体的不同的属性。

所以,我们通常使用泛型集合的方式来作为返回值,更加方便。

二、那么。应用在实际编程中,该怎样应用它呢?在这里谨表自己做一下笔记。

这里,仅仅是将我们原来的返回值datatable类型进行转换成为泛型集合类,因为每次转换的步骤是一样的。

因为非常多时候,我们常常会在显示层,来显示数据,所以同一时候。我们在显示层也会须要用到返回的实体,也就是说,我们在U,B。D层都可能会用到返回值。

所以。我们将转换的方法抽象出一个类来放到实体层(可依据自己习惯建立)。以供各层随时调用。

Imports System.Collections.Generic
Imports System.Reflection
Public Class ConvertHelper
'of T as new 用来对T进行约束,必须包括有空的无參构造函数
Public Shared Function ConvertToList(Of T As {New})(ByVal dt As DataTable) As List(Of T)
'定义一个泛型集合,用于存放返回集合
Dim ds As New List(Of T) '定义一个变量。来得到返回集合中实体类型
Dim type As Type = GetType(T) '定义一个暂时变量。用来存放datatable中的每一个实体的属性
Dim proName As String = String.Empty '初始调用时,为空字符串 '定义行实体
Dim dr As DataRow
'遍历DataTable中的全部数据行,即全部记录
For Each dr In dt.Rows
'实例化一个泛型集合中的实体,即代表一条记录
Dim record As New T
'定义一个属性信息的集合
'propertyInfo探索屬性 (Property) 的屬性 (Attribute),並提供屬性中繼資料 (Metadata) 的存取
Dim propertys() As PropertyInfo = record.GetType().GetProperties() '获取实体的全部属性
'遍历全部属性
Dim pro As PropertyInfo
For Each pro In propertys
'每循环一次将属性的名称赋值给暂时变量proName
proName = pro.Name
'利用暂时遍历中的属性名称来检查该记录中是否包括此列
If dt.Columns.Contains(proName) Then
'包括此列的同一时候,必须保证该列可写
If pro.CanWrite = False Then Continue For '直接跳出,继续执行循环
'取值
Dim value As Object = dr(proName) '保存列名的值
If (value.ToString <> DBNull.Value.ToString()) Then '假设非空。则赋给对象的属性   
'用索引化属性的可选索引值设置指定对象的该属性值 pro.SetValue(record, value, Nothing) '在执行期间,通过反射,动态的訪问一个对象的属性
End If
End If Next
ds.Add(record)
Next
Return ds '返回实体的泛型集合 End Function
End Class

在上述代码中,还需注意一个方法:setvalue,这种方法存在于System.Reflection这个命名空间中,所以,须要提前引用。

在创建该转换函数时,须要对类型<T>进行约束。假设client代码尝试使用某个约束所不同意的类假设client代码尝试使用某个约束所不同意的类型来实例化类,则会产生编译时错误。这里通过一个空的构造函数New来进行约束。

三、返回值

作为我们声明方法的一类返回值,返回类型能够为一个单独的实体,即仅仅含有一条记录。或者返回一个含有多条记录的集合(list)

比如:as T

或者 as list(of T)

四、与控件连接显示数据

在与DataGridView控件进行连接显示数据时,我们仅仅要将我们原来的数据源改为声明的列表就可以,同一时候注意应将自己主动载入列属性(AutoGenerateColumns)改为TRUE,否则控件中不能显示数据。

有一个疑问:原来使用datatable时。在控件第一行的名称能够通过D层查询语句使用别名的方式,直接显示在控件中,比如sql="select UserName as username where ID=@ID",但是将数据源设为列表时,便不能显示了。并且也不能载入数据。攻克了非常长时间,还是没能找到一个合理的原因。最后仅仅好在U层直接编辑HeaderText了。

以上是学习到的泛型集合的相关知识。通过机房重构,运用三层,结合设计模式,发现能够学习到非常多新的知识,增长非常多见识,慢慢的认为编程还是非常有意思的。

继续努力!

使用泛型集合取代datatable作为返回值实现面向对象的更多相关文章

  1. [工具类]泛型集合转换为DataTable

    写在前面 在实际项目中,用到了将集合转换为DataTable,就试着封装了一个方法,记录一下. 代码 using System; using System.Collections.Generic; u ...

  2. 泛型集合转换为DataTable

    在做项目中,遇到了将集合转换为DataTable的使用,在网上看了资料,在这里记录下来,分享. using System; using System.Collections.Generic; usin ...

  3. 泛型集合、datatable常用数据类型转换Json帮助类

    泛型集合.datatable常用数据类型转换Json帮助类 using System; using System.Data; using System.Configuration; using Sys ...

  4. C#基础知识之泛型集合转换为DataTable

    在做项目中,遇到了将集合转换为DataTable的使用,在网上看了资料,在这里记录下来,分享. using System; using System.Collections.Generic; usin ...

  5. C#;DataTable添加列;DataTable转List泛型集合;List泛型集合转DataTable泛型集合;

    给DataTable添加列 string sql = "select * from cgpmb order by code"; DataTable dt = Bobole.Data ...

  6. java中的方法返回值使用泛型,实现灵活的返回值类型

    痛点:      使用Mybatis框架的时候,想封装一个底层JDBC控制器,用于提供和Mybatis交互的增删改查接口(公用的接口),但由于公用的查询方法可能是用户自定义的任意一个和表对应的java ...

  7. List泛型集合转DataTable

    自存,此方法可以防止出现DataSet不支持System.Nullable的错误 public static DataTable ToDataTable<T>(IEnumerable< ...

  8. LIST<>泛型集合取得对象的属性值

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. C#基础精华03(常用类库StringBuilder,List<T>泛型集合,Dictionary<K , V> 键值对集合,装箱拆箱)

    常用类库StringBuilder StringBuilder高效的字符串操作 当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作. String 对象是不可变的. 每次使用 System. ...

随机推荐

  1. 初识Spring——Spring核心容器

    一. IOC和DI基础 IOC-Inversion of Control,译为控制反转,是一种遵循依赖倒置原则的代码设计思想. 所谓依赖倒置,就是把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑 ...

  2. html5那些事儿

    一.优势1.标签的改变:<header>,<footer>,<dialog>,<aside>,<figure>,<section> ...

  3. web客户端安全之跨站点请求伪造攻击

    CSRF攻击,Cross-site request forgery,跨站点请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种 ...

  4. 防止sql注入的几种方法

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  5. 使用IIS实现反向代理

    IIS的反向代理是通过ARR模块来完成的,ARR模块需要另外安装,而且只能通过Web PlatForm Installer安装.关于安装来源与步骤,帖子已有很多,不做描述.启用“Application ...

  6. A server is already running. Check /home/peter/stock/tmp/pids/server.pid. Exiting【Xshell 运行rails s 报错】

  7. Oracle VM VisualBox 虚拟机创建共享文件夹。

    先来啰嗦几句,公司的电脑用的是 VMware10的虚拟机  相信大家都很熟悉了   VMware 创建共享文件功能可以直接安装tools来实现 但是 Oracle VM VisualBox  第一次玩 ...

  8. java并发基础(一)

    最近在看<java并发编程实战>,希望自己有毅力把它读完. 线程本身有很多优势,比如可以发挥多处理器的强大能力.建模更加简单.简化异步事件的处理.使用户界面的相应更加灵敏,但是更多的需要程 ...

  9. Assembly类

    System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到. 由于这个类实在有太多的字段.属性与方法.实在不想将一个个属性方法从MSDN复制出来然后逐个属性.方法敲 ...

  10. what is a process?

    A process is a program in execution. A process is more than the program code, which is sometimes kno ...