在上一篇中文章中简单介绍了一下《sqlHelper》,而在这里我再介绍一下关于dataTable转换成实体集合的方法,为什么要介绍一下dataTable转换成实体集合呢?因为在sqlHelper中,我们在对数据库中的数据表进行查询时,返回的是一条记录,而不是一个单个的实体,例如查询操作员工作记录,将查找的信息返回实体时就会报错。如果要是让sqlHelper返回实体的话,那样太麻烦了。如果要返回一个实体的话,我们就要每查询一个新的数据表,就要重新创建一个新的sqlHelper。
解决这个dataTable转换实体的问题——泛型集合
什么叫泛型?泛型有什么好处?
刚接触泛型这个词时,感觉挺深奥的,其实不然它的作用很简单,它为面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以时程序性能得到提高。
Imports System.Collections.Generic '增加泛型的命名空间,用来管理泛型集合
Imports System.Reflection '加入反射,为了引用 PropertyInfo
Public Class GenericEntityHelper
'将dataTable中的数据转换为实体集合,其中T为一种类型集合代表,new为约束,在这里使用new关键字的作用只是让编译器在泛型实例化之处,检查所绑定的泛型参数是否具有无参构造函数.
Public Shared Function ConvertToList(Of T As New)(dt As DataTable, ts As IList(Of T))
'获得T的类型
Dim type As Type = GetType(T)
'定义一个临时变量
Dim strTemp As String = String.Empty
'遍历表中所有行数
For Each dr As DataRow In dt.Rows
'定义类型变量act获取动态创建对象T的类型。
'Activator.CreateInstance(表示动态创建类对象的, 在运行的时候指定需要需要创建的类型)
Dim act As T = If((Nothing Is Nothing), Activator.CreateInstance(Of T)(), Nothing)
'引用反射表示可获得对象的所有属性组成的集合
Dim propertys As PropertyInfo() = act.[GetType]().GetProperties()
'定义array变量,接收propertys中含有的属性,并提供对属性propertys元数据访问
Dim array As PropertyInfo() = propertys
Dim intCount As Integer = 0 '定义一个整型变量
'遍历所有对象属性
While intCount < array.Length 'length表示所有维数中元素的总和
'pr表示元素中含有的属性,并提供对数据访问
Dim pr As PropertyInfo = array(intCount)
strTemp = pr.Name '将属性名称赋值给临时变量
'检查DataTable是否包含此列 列名==对象的属性名
If dt.Columns.Contains(strTemp) Then
'判断此属性是否设置函数
If pr.CanWrite Then '该属性是否可写
Dim value As Object = dr(strTemp)
'如果非空,则赋值给对象的属性
If value IsNot DBNull.Value Then
'设置对象的属性值。
pr.SetValue(act, value, Nothing)
End If
End If
End If
intCount += 1 '下一个元素
Continue While '执行下一个while循环
End While
'添加对象到泛型集合中
ts.Add(act)
Next
Return ts '返回
End Function
End Class
通过泛型的学习,自己深有体会米老师说过的一句话“不怕不知道,就怕不知道”。在学习上遇到新的东西我们要自己去动手实践。不要明知道有这么个东西却怎么也不想去理解它,学习它。最后导致自己真的什么都不知道了。