泛型初了解

List<T>泛型只是泛型中的一种,很多地方都可以用到泛型,dictionary、list、反射、委托……

泛型

程序设计语言的一种特性,使得程序员在强类型程序设计语言中可以定义一些可变的部分,这些可变的部分在使用前必须做出指明,泛型实际是具有占位符的类、结构、接口、和方法。

占位符:先占住一个固定的位置,等着你再往里面添加内容的符号

强类型语言:不同类型之间有严格的定义,只有相同的变量才能操作。

弱类型语言:没有明显的类型区别,各个类型之间可以自动的转换。

在三层中师父就要求不可以将D层的传DataTable到B层或U层,一只不明白为什么现在来看一下他们有什么区别。

DataTable和List泛型集合

DataTable是将数据库中表的数据接收保存在自己行列中,也就是说它是一个数据的集合;

List泛型集合是将数据库中的每一条记录转变为一个实体对象保存到List中,所以它是对象的集合。

将DataTable里的字段数据转换为实体中的属性值,然后添加到List泛型这个实体集中。

这样做的好处

如果是直接的将DataTable在三层之间传递数据,不符合三层要求因为三层之间只传递实体没有其他的,如果传递的是DataTable就就违背的这个要求。

下面卡代码来进一步的理解

Public Class EntityHlper
    '将DataTable里转换为List
    ''' <summary>
    ''' 将查到的DataTable转换为List
    ''' </summary>
    ''' <typeparam name="T">参数类型,一般是和DataTable查到的结果一样</typeparam>
    ''' <param name="dt">要进行转换的DataTable表</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function convertToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)  '将DataTable类型的dt转化为到List中
        ' 其中的T表示泛型,是使用时可以使用任何类型的数据型进行替换。
        '(Of T As {New})这里的new是用来约束T的必须有
        'Dim mytype As Type = GetType(T)   'GetType作用:返回指定类型的 Type 对象。 Type 对象提供有关类型的信息,如类型的属性、方法和事件。

        Dim mylist As New List(Of T) '定义一个List集合,接收DataTable的返回会结果,而List的类型就是convertToList方法传来的T参数
        Dim dr As DataRow  '定义dr为DataTable的行
        Dim tempName As String = String.Empty ' 定义临时变量tempName  String.Empty 表示空字符串。 此字段为只读。
        For Each dr In dt.Rows  '在表中的每一行
            Dim myT As New T
            '其中PropertyInfo作用:发现属性 (Property) 的属性 (Attribute) 并提供对属性 (Property) 元数据的访问。即获得Attribute。  property的是性质的意思,Attribute是属性的意思
            Dim propertys() As PropertyInfo = myT.GetType().GetProperties()  '得到参数传来的类型的属性并且可以访问数据的值
            'GetProperties获取当前 Type 的属性。'定义一个数组,用来存储实体的属性
            Dim pr As PropertyInfo
            '遍历取得属性的名字,然后将一行的值传到List中
            '**************************************************************************
            '这一部分读取到实体的属性,同时通过循环将需要转换的DataTable的每一条记录转换为实体,然后添加到List泛型集合中
            For Each pr In propertys
                tempName = pr.Name

                If (dt.Columns.Contains(tempName)) Then   'dt的列中如果包含指定的tempName
                    If (pr.CanWrite = False) Then  '检查获得的属性是否可写
                        Continue For  '不可以就继续循环
                    End If
                    'Dim value As Object = Trim(dr(tempName).ToString)   '将行上的某列(即某个单元格内的value)转换为字符串
                    Dim value As Object = dr(tempName)
                    If (value.ToString() <> DBNull.Value.ToString()) Then  '如果不是空的
                        '将myT的值设为制定的value的值,其中NOthing代表的是第三个参数应该为index但是对非索引化的属性就使用Nothing
                        pr.SetValue(myT, value, Nothing)

                    End If
                End If
            Next
            '****************************************************************************
            mylist.Add(myT)   '向List列表中添加查到的结果,添加的myT类型是前面声明的T的类型。
        Next
        Return mylist
    End Function
End Class

在D层中的调用

''' <summary>
    ''' 选择正在上线的教师,并且返回所有的结果
    ''' </summary>
    ''' <returns>返回所有的正在上机的记录</returns>
    ''' <remarks></remarks>
    Public Function SelectOnWork() As List(Of Entity.Model.WorkLogEntity) Implements IDAL.IWorkLog.SelectOnWork
        Dim dt As DataTable
        Dim sql As String
        Dim mylist As List(Of Entity.Model.WorkLogEntity) '定义一个list的类型,将T定义为工作记录的实体
        sql = "Select * from T_WorkLog where isOnWork='是' and Level='操作员'"
        dt = SQLDBHlper.GetDataTable(sql, CommandType.Text) '调用SQLHelper的方法,得到查询的所有的结果,放到dt这个DataTable中
        mylist = EntityHlper.convertToList(Of Entity.Model.WorkLogEntity)(dt) '调用convertToList方法将dt中的结果转换为List
        Return mylist
    End Function

这样就可以将在D层查到的存放在DataTable的数据转换为实体放到List集合中。

时间: 2024-10-23 01:53:24

泛型初了解的相关文章

泛型初认识

数据类型是每一个编程人员都要认真研究的知识,这篇文章就来介绍一下菜鸟了解数据类型的"心酸"历程. 从开始接触编程语言就有了数据类型,诸如integer.string.boolean.time.float.double--,慢慢地有认识了实体类型,还有就是接下来的各种集合类.不管怎么讲他们都是由object类型向下衍生出来的: 背景: ArrayList是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型,添加到 ArrayList中的任何引用或值类型都将隐式地向上强

Java初谈之泛型

/* * * 泛型与c++的模版有异曲同工之妙 * 泛型是面向对象的 * *函数基本使用格式 < T> 返回值 函数名(){} //可以是任意的大写字母不一定非是T *类基本使用格式 class classname<T> {}  以及 class classname<T extend interface & implements>{} * *使用方式和普通类是一样的 采用new的形式 只不过T要有具体的类(不是对象)代替 泛型无外呼泛型方法和泛型类 下面对常见的

数据结构泛型之初接触

1. 设计一个泛型类 Collection,它存储 object 对象的集合(在数组中),以及该集合的当前大小,提供......等方法. import java.util.Arrays; /** * @author 小喵钓鱼 * @date 2020-02-13 12:21 * @veision 1.10 */ public class Collection<E> { private Object[] elementData; // setter public void setElementD

Java 中的泛型详解-Java编程思想

Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的对象的类型 class Holder1 { private Circle a; public Holder1(Circle a) { this.a = a; } Circle get() { return a; } } 上面的类的可重用性不怎么样,无法持有其他类型的任何对象,下面通过持有Object

Java中的泛型 (上) - 基本概念和原理

本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以深刻理解容器类.那,泛型到底是什么呢? 什么是泛型? 一个简单泛型类 我们通过一个简单的例子来说明泛型类的基本概念.实现原理和好处. 基本概念 我们直接来看代码: public class Pair<T> { T first; T second; public Pair(T first, T se

计算机程序的思维逻辑 (37) - 泛型 (下) - 细节和局限性

35节介绍了泛型的基本概念和原理,上节介绍了泛型中的通配符,本节来介绍泛型中的一些细节和局限性. 这些局限性主要与Java的实现机制有关,Java中,泛型是通过类型擦除来实现的,类型参数在编译时会被替换为Object,运行时Java虚拟机不知道泛型这回事,这带来了很多局限性,其中有的部分是比较容易理解的,有的则是非常违反直觉的. 一项技术,往往只有理解了其局限性,我们才算是真正理解了它,才能更好的应用它. 下面,我们将从以下几个方面来介绍这些细节和局限性: 使用泛型类.方法和接口 定义泛型类.方

.NET 4.0中的泛型协变和反变

随Visual Studio 2010 CTP亮相的C#4和VB10,虽然在支持语言新特性方面走了相当不一样的两条路:C#着重增加后期绑定和与动态语言相容的若干特性,VB10着重简化语言和提高抽象能力:但是两者都增加了一项功能:泛型类型的协变(covariant)和反变(contravariant).许多人对其了解可能仅限于增加的in/out关键字,而对其诸多特性有所不知.下面我们就对此进行一些详细的解释,帮助大家正确使用该特性. 背景知识:协变和反变 很多人可能不不能很好地理解这些来自于物理和

C++primer第十一章 泛型算法

标准库容器定义的操作非常少.标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是“泛型”的,可作用在不同类型的容器和不同类型的元素上. 因为它们实现共同的操作,所以称之为“算法”:而“泛型”指的是它们可以操作在多种容器类型上——不但可作用于 vector 或 list 这些标准库类型,还可用在内置数组类型.甚至其他类型的序列上. 11.1. 概述 假设有一个 int 的 vector 对象,名为 vec,我们想知道其中包含某个特定值.解决这个问题最简单的

Java泛型:泛型的定义(类、接口、对象)、使用、继承

地址   http://blog.csdn.net/lirx_tech/article/details/51570138 1. 设计泛型的初衷: 1) 主要是为了解决Java容器无法记忆元素类型的问题: i. 由于Java设计之初并不知道会往容器中存放什么类型的元素,因此元素类型都设定为Object,这样就什么东西都能放了! ii. 但是这样设计有明显的缺点: a. 取出元素的时候必须进行强制类型转换(尽管集合在运行时里面元素的"运行时类型"不变,即元素的getClass返回的还是最初