List<T>泛型只是泛型中的一种,很多地方都可以用到泛型,dictionary、list、反射、委托……
泛型
程序设计语言的一种特性,使得程序员在强类型程序设计语言中可以定义一些可变的部分,这些可变的部分在使用前必须做出指明,泛型实际是具有占位符的类、结构、接口、和方法。
占位符:先占住一个固定的位置,等着你再往里面添加内容的符号
强类型语言:不同类型之间有严格的定义,只有相同的变量才能操作。
弱类型语言:没有明显的类型区别,各个类型之间可以自动的转换。
在三层中师父就要求不可以将D层的传DataTable到B层或U层,一只不明白为什么现在来看一下他们有什么区别。
DataTable和List泛型集合
DataTable是将数据库中表的数据接收保存在自己行列中,也就是说它是一个数据的集合;
List泛型集合是将数据库中的每一条记录转变为一个实体对象保存到List中,所以它是对象的集合。
如上图将DataTable里的第一行的字段数据转换为实体中的属性值,然后添加到List<T>这个实体集中,作为第一个实体。向后以此类推
这样做的好处
如果是直接的将DataTable在三层之间传递数据,如果要使用某个数据的话要知道它是在数据表中的第几个字段然后写成这样:“Datatable.rows(0).Item(1)”这样可以取得第一行的第二个字段的值,这样做B层和U层还是得知道数据库的结构,如果是用的List<T>可以直接的用List.item(0).实体的属性 这样就可以取得第一个实体的任何的属性。
具体的来看看这是怎么用的:
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集合中。