刚开始敲机房的时候用的是DataTable返回数据,看博客的时候看大家都转泛型了,泛型是个是什么东东,为什么要用那?
泛型刚开始听到这个词的时候觉得很“高大上”,难于理解,那也得硬着头皮上对不对,查呗,,,
百度上是这么说的:泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。 (ps:在.net Framework中的定义,跟java、C++中还是有些区别的)
现阶段在机房重构中用到的是List<T>,它只是泛型类(List<>线性表、Dictionary<>字典,属于堆排序、Queue<>队列、Stack<>栈……)中的一种。
实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,到实体类的属性中,再把所有的实体类存在泛型集合中
在机房重构中,主要体现在显示从数据库中查询的数据
用DataTable是这样的:
txtStudentNo.Text = dt.Rows(0).Item(2) txtName.Text = dt.Rows(0).Item(3) txtSex.Text = dt.Rows(0).Item(4) txtGrade.Text = dt.Rows(0).Item(6) txtClass.Text = dt.Rows(0).Item(7) txtStatus.Text = dt.Rows(0).Item(11)我们显示的信息必须对应数据库中各个字段对应的位置,增加了与数据库的耦合性。
用List(T)是这样的:
txtStudentNo.Text =mylist(0).studentNo txtName.Text = mylist(0).Name txtSex.Text = mylist(0).sex txtGrade.Text = mylist(0).Grade txtClass.Text = mylist(0).Class txtStatus.Text = mylist(0).Status直接显示对应List(T)泛型的属性,不用知道数据库中字段的顺序
在D层中定义了一个类:
'将datatable转化为泛型 Public Shared Function convertToGeneric(Of T As {New})(ByVal dt As DataTable) As IList(Of T) '定义最终返回的集合 Dim myGenerics As New List(Of T) '得到实体类的类型名 Dim myType As Type = GetType(T) '定义行集 Dim dr As DataRow '定义一个临时变量 Dim tempName As String = String.Empty '遍历datatable的所有数据行 For Each dr In dt.Rows '定义一个实体类的对象 Dim myT As New T '定义属性集合 Dim propertys() As PropertyInfo = myT.GetType().GetProperties() Dim Pr As PropertyInfo '遍历改对象的所有属性 For Each Pr In propertys tempName = Pr.Name '将属性名称赋值给临时变量 '检查datatable是否包含此列(列明==对象的属性名) If (dt.Columns.Contains(tempName)) Then '将此属性与datatable里的列名比较,查看datatable是否包含此属性 '判断此属性是否有setter If (Pr.CanWrite = False) Then '判断此属性是否可写,如果不可写,跳出本次循环 Continue For End If Dim value As Object = dr(tempName) '定义一个对象型的变量来保存列的值 If (value.ToString <> DBNull.Value.ToString()) Then '如果非空,则赋给对象的属性 Pr.SetValue(myT, value, Nothing) '在运行期间,通过反射,动态访问一个对象的属性 End If End If Next myGenerics.Add(myT) '添加到集合 Next Return myGenerics '返回实体集合 End Function在对应查询时调用此方法:
Dim sqlhelper As New sqlHelper.sqlHelper Dim cmdType As New CommandType Dim cmdText As String cmdText = "select * from T_User " Dim dt As DataTable Dim myList As New List(Of Entity.UserInfo) dt = sqlhelper.ExecuteSelect(cmdText, cmdType) If dt.Rows.Count > 0 Then '调用转泛型的方法 myList = ConvertToGenerics.convertToGeneric(Of Entity.UserInfo)(dt) Return myList Else Return Nothing End If
虽然知道了泛型在机房中怎么用,但并没有真正地掌握泛型,希望在接下来不断学习,理解越来越透彻!
若有哪里不对的地方,请多多指正!