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集合中。
原文:http://blog.csdn.net/yxflovegs2012/article/details/42399351