zoukankan      html  css  js  c++  java
  • 再次解读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的语法和规则,也是解耦的一种方式。如图:

    感悟:

    我觉得的我应该经常和别人沟通这些我不懂的问题,不要老是死憋着。

  • 相关阅读:
    Android Api 检查參数状态Api
    【Jquery】prop与attr的差别
    【CODEFORCES】 A. Dreamoon and Sums
    使用&lt;jsp:include&gt;,不想写死URL,动态生成URL的解决的方法
    android.app.Activity 的介绍
    字符变换
    android之获取屏幕的宽度和高度
    2015跑过的路
    hdu5418--Victor and World(floyd+状压dp)
    解决PL/SQL Developer 连接oracle 11g 64位中的问题
  • 原文地址:https://www.cnblogs.com/tanqianqian/p/5975051.html
Copyright © 2011-2022 走看看