再次解读ConvertHelper
ConvertHelper类理解
1. 没写ConvertHelper类之前
数据库临时表的数据都是通过我们自己判断转换传入实体中的。(如图)
如上图所示,所查询出来的DataTable的username字段和sex字段的值是直接赋到实体E_user的username和sex属性里面的。赋值的过程,是通过我们自己判读输入的:
User.username = reader.GetString(2) user.sex = reader.GetString(3)
按照这样的方式,每当我们增加查询一些临时表的信息的时候,我们都要一个一个进行赋值,这样做,经常会出现类型转换错误等问题。
2. 通过ConvertHelper类封装了一个专门赋值的方法。
我认为ConvertHelper类就像一个数据加工箱子,你查询出来DataTable的数据直接扔ConvertHelper,ConvertHelper就会自动进行赋值转换。(如图)
通过这个泛型转换方法,无论我们查询出来神马数据,都可以通过几行代码轻松实现,都不用自己再一个个去赋值。代码如下:
<span style="font-size:14px;"> Dim myList As List(Of Entity.Users) myList = Entity.ConvertHelper.converToList(Of Entity.Users)(dt)</span>
converToList(Of T As {New})方法理解
找了好多博客,虽然代码上都有注释,但是这个里面的逻辑我还是一知半解,糊里糊涂的,正好今天问了九期的师哥,让他给我讲了讲。
1. 遍历所有属性
首先我们要知道SetValue方法,这个方法msdn解释为:“设置依赖项属性的本地值,指定由其依赖项属性标识符。”
什么是依赖项本地值?
答:当您定义自己的属性并需要它们支持 Windows Presentation Foundation (WPF) 功能的诸多方面(包括样式、数据绑定、继承、动画和默认值)时,应将其实现为依赖项属性。
从上面的话我们可知,我们首先是要定义自己的属性,并且这些属性还能支持数据绑定功能。
在我converToList这个方法中,pr.SetValue(myT, value.ToString, Nothing)就是设置myT为依赖项属性标识符,value是指新的本地值。通过这个方法就能把datatable里面的字段绑定为属性了。通过映射的方法,直接找到相对应的属性名称(由于数据库和实体属性名称是一致的)。
现在我们要做的是对一行数据中字段进行遍历,代码如下:
For Each pr In propertys tmpName = pr.Name '将属性的名称赋值给临时变量 Dim value As Object = dr(tmpName) '定义一个对象型的变量来保存列的值 If (value.ToString() <> DBNull.Value.ToString()) Then '在运行期间,通过反射,动态的访问一个对象的属性 pr.SetValue(myT, value.ToString, Nothing) End If
这段代码的思路大体是通过循环属性集合中的每一个属性,比较属性名称和datarow字段里的名称是否一样,如果是一样,就把这个属性设置成依赖项本地值,就能把给属性赋值。
2. 遍历所有行
当所有的属性遍历完了,并不是全部完成,因为我们这个遍历的是一条数据里面的所有属性,一个datatable里面是有很datarow的,怎么办?并且,我们刚刚遍历完的这条数据怎么办呢?
第一个问题比较简单直接循环行就好了。
第二个问题,遍历完的数据由于我们之前已经Dim myList As New List(Of T) 定义了一个myList的集合,集合就是一个大熔炉,把这条数据直接扔进去就好,这条语句是: myList.Add(myT)。
这样集合数据里面的东西就能根据字段名与属性名一致性这个条件,自动找好自己相应的属性位置。
思考,为什么不直接用dataTable传输数据呢?
一般来说,我们都是按照三层传递数据的,假设我们数据传递直接是通过datatable,也就是表的形式,那么,BLL和UI层都需要知道数据库的命名规则,也需要知道表中的字段代表了什么,之所以加上Entity层, 变成BLL和UI层可以理解的语言,不要知知道DB的语法和规则,也是解耦的一种方式。如图:
感悟:
我觉得的我应该经常和别人沟通这些我不懂的问题,不要老是死憋着。