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

开会的时候,师父说,我们在机房重构时,尽量不要用datatable作为返回值,改用泛型集合的方式,这样可以实现真正的面向对象。通过查资料和同学交流,把这个问题给解决了。对于泛型集合,我也有了一些认识。

一、对泛型集合的认识

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

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

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

那泛型集合与datatable相比,到底有什么优点呢?

1.datatable在使用时,需要了解数据库的结构,比如,我们想要获得某个字段的值,就必须知道它在数据表中的第几个字段。datatable.rows(1).Item(2)等,但是,使用泛型集合则不用,比如想要获得用户的用户名,则可以直接写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>进行约束。如果客户端代码尝试使用某个约束所不允许的类如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这里通过一个空的构造函数New来进行约束。

三、返回值

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

例如:as T

或者 as list(of T)

四、与控件连接显示数据

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

有一个疑问:原来使用datatable时,在控件第一行的名称可以通过D层查询语句使用别名的方式,直接显示在控件中,例如sql="select UserName as 用户名 where [email protected]",可是将数据源设为列表时,便不能显示了,而且也不能加载数据。解决了很长时间,还是没能找到一个合理的原因。最后只好在U层直接编辑HeaderText了。

以上是学习到的泛型集合的相关知识。通过机房重构,运用三层,结合设计模式,发现可以学习到很多新的知识,增长很多见识,慢慢的觉得编程还是很有意思的。继续努力!

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

时间: 2024-10-09 19:53:07

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

泛型集合转换为DataTable

在做项目中,遇到了将集合转换为DataTable的使用,在网上看了资料,在这里记录下来,分享. using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Wolfy.List2DataTable { class Pro

LIST&lt;&gt;泛型集合取得对象的属性值

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace CacheTest { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object send

C#泛型集合List&lt;T&gt;用法总结

List<T>在C#应用程序中是一种快捷.易于使用的泛型集合类型,使用泛型编程为编写面向对象程序增加了极大的效率和灵活性,不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换. 补充说明: 在决定使用IList<T> 还是使用ArrayList类(两者具有类似的功能)时,记住IList<T> 类在大多数情况下执行得更好并且是类型安全的. 如果对IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的.但是,如果对类型 T 使用值类

关于List&lt;&gt;(实体类)泛型集合转DataTable_ONE

// 泛型集合转DataTable,T为Linq实体类 public delegate void GetDataTableRow<T>(T t,System.Data.DataTable d);        public static void ExcelOut2<T>(DataGrid gt, GetDataTableRow<T> GetDataTableRow)        {                            ItemCollection

laravel 返回值

先理解几个概念: StdClass 对象 => 基础的对象 Eloquent 模型对象 (Model 对象) => 和模型相关的类对象 Eloquent 集合 => 可以简单理解为对象数组,里面的每一个元素都是一个 Model 对象 DB Facades $users = DB::table('users')->get(); 返回值:数组结果,其中每一个结果都是 StdClass $user = DB::table('users')->first();返回值:单个 StdCl

vb.net环境下将DataTable转成泛型集合方法

背景 做机房收费系统的时候,遇到这样一个问题,将数据库表中的数据取出一行,将每个单元格中的内容填充到窗体 的文本框中.考虑到用DataReader获取结果的复杂性,我就用了泛型集合.可是这么一用却出现了如图所示的问 题. 问题一: 出现这种问题,是因为在DataTable转实体类型时表的字段类型和实体的字段类型不一致造成的. 这个也可以 这么说,中国人的孩子都随父姓,这是传统.但孩子随母姓,就有些不妥. 问题二: 数据库表中字段名和要转换的实体属性字段名不一致,导致转换后实体中depart为空值

返回值该是什么?——泛型实践

对于泛型的初步的了解,请见http://blog.csdn.net/lifen0908/article/details/43450921  .这篇博客主要是说说泛型在机房中的运用. 一.假如是返回值实体: 我用查询学生基本信息的窗口来说明当我们的返回值是实体的情况: 首先是D层: <span style="font-family:KaiTi_GB2312;"> Dim sql As String '定义字符串变量sql 用于存放要执行的sql语句 Dim table As

DataTable转化为泛型集合

前一段时间,因为做机房重构基本思路都没有搞清楚,然后周围接触的概念太多了,就想一开始什么都加上,不堪重负,起步很慢.后来经亮哥提点,一点一点的加东西,就好很多了. 对于泛型集合,前面有很多男神女神已经写的很详细了.但是知识自己总结的才能算是印脑子里了.我就写写自己的理解吧. 看完关于泛型集合的相关资料(博客.设计模式.网上其他一些介绍...),理一理思路: 是什么? [泛型是具有占位符(类型参数)的类.结构.接口和方法.这些占位符是类.结构.接口和方法所存储或使用的一个或多个类型的占位符. 泛型

对比两个同类型的泛型集合并返回差异泛型集合 ——两个List&lt;类名&gt;的比较

1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam name="T">泛型类型</typeparam> 5: /// <param name="newModel">修改后的数据集合</param> 6: /// <param name="oldModel"&g