前言

我们都知道在机房重构的时候,大多数都在用七层进行重构,每一层都依赖实体。所以不管怎么调用,返回的应该是实体参数,这样才符合大多数的逻辑,这样我们试想一下,如果我们要求在U层返回多个实体值,怎么办,返回一个布尔进行B层的判断,这些问题,根据SQLHelper,增、删、改、查四条线,分为了无参和有参两种类型,查询的时候我们要求返回一个datatable,可是如果单单用这个datatable返回会不会么有实体的事情了。所以这时候泛型就出来了。在我看来它集成了所以实体的集合,方便,简单,减少内存的占用。

泛型

定义

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法存储或者使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型或其方法的参数类型出现。泛型的方法还可以将参数类型用作返回值类型或者某个形参的类型。

上面的解释是官方解释,下面是我自己的理解:

  • 泛型就是一种集合,封装了一种类型的转换,让该类型只能转换为一种类型。很好的避免了装箱和拆箱的过程。
  • 泛型是引用类型,分配到堆中,若要将值类型打包到引用类型(object)一个实例中

不用泛型的情况:

装箱C#版

        int i = 123;
object obj = (object)i;//装箱

拆箱C#版

        object obj = 123;
int i;
i=(int )obj;//拆箱

使用泛型:

        IList <T >;//T为集合数据或者指定的数据类型;
List <T>;//T为集合数据或者指定的数据类型;

下面来说我机房重构中,怎么使用泛型的,首先要将SQLHelper中返回的DataTable转换成泛型,需要定义一个转换类,通过调用这个类来实现转换。

ConvertList类

Imports System.Reflection
Module ConvertHelper
Public Class ConvertHelper
'将datatable转换为泛型集合
Public Shared Function ConvertToList(Of turn As {New})(ByVal dt As DataTable) As IList(Of turn)
'这里new是用来约束的; Dim mylist As New List(Of turn) '定义最终返回的集合
Dim myType As Type = GetType(turn) '得到实体类的类型名
Dim dr As DataRow '定义行集
Dim tmpName As String = String.Empty '定义一个临时变量 '遍历datatable表的所有数据行
For Each dr In dt.Rows
Dim myturn As New turn
Dim propertys() As PropertyInfo = myturn.GetType().GetProperties() '定义属性集合
Dim pr As PropertyInfo '遍历该对象的所有属性
For Each pr In propertys
tmpName = pr.Name '将属性名称赋值给临时变量
If (dt.Columns.Contains(tmpName)) Then '将此属性与datatable属性相比较,查看datatable是否包含了此属性;
'判断此属性是否含有setter If (pr.CanWrite = False) Then
Continue For
End If Dim value As Object = dr(tmpName) '定义一个对象型的变量来保存列的值
If (value.ToString <> DBNull.Value.ToString) Then '如果非空则赋给对象属性
pr.SetValue(myturn, value, Nothing) '在运行期间通过反射,动态的访问一个对象的属性
End If
End If
Next
mylist.Add(myturn) '添加到集合
Next
Return mylist
End Function
End Class
End Module

泛型和“DataTable”转换部分:

<span style="font-family:KaiTi_GB2312;font-size:18px;">
</pre><pre code_snippet_id="1597926" snippet_file_name="blog_20160305_5_4092007" name="code" class="html">    Public Function IsExistsLogInfo(BasicInfo As Login.Entity.BasicSetEntity) As List(Of Login.Entity.BasicSetEntity) Implements IBasicSetDAL.IsExistsLogInfo
Dim mylist1 As New List(Of Login.Entity.BasicSetEntity)
Dim table1 As DataTable
Dim sql As String = "Select * from TC_BasicData"
table1 = SQLHelper.sqlhelper.ExecSelectNo(sql, CommandType.Text)
mylist1 = ConvertHelper.ConvertHelper.ConvertToList(Of Login.Entity.BasicSetEntity)(table1)
Return mylist1
End Function</span>

泛型的好处:

1、  优于集合的使用,值类型和引用类型的转换不用进行拆装箱。

2、  泛型在使用或者实例化的时候,指明了内部的对象类型或内部数据,避免了集合类型的不安全。

3、  泛型在内存的处理上大于“DataTable”。

小结

1、  每一次和陌生知识的独处,都意味着一种成长。

2、  每一次的蜕变都意味着梦想的加温。

机房重构——泛型和“DataTable”的更多相关文章

  1. 泛型转Datatable

    //自定义扩展方法 public static class ExtMethod { //泛型转为DataTable public static DataTable AsDataTable<T&g ...

  2. 机房重构包图(从三层+实体到三层+实体+外观+工厂+接口+SQLHelper)

    刚刚开始接触三层的时候,我只做了两个登录小窗体的例子.画了简单的包图,可以说,为后面机房重构留下了大量的工作(因为三层理解没有深度,也没有理解出自己的东西).不过,欠下的总要还的.在做机房重构的时候, ...

  3. .NET重构(九):机房重构验收总结

    导读:机房收费系统个人重构版,在寒假前,已经结束了.嗯,这一路的过程,也挺心酸的.结合师傅验收时的指导.建议,对这一段时间的学习,进行一个总结. 一.学习过程 这一阶段的学习,按照师傅给的建议是:由浅 ...

  4. 【机房重构】—上机&amp;订餐

    前几天通过UML图中的时序图.让我对于机房重构中的每一条线理解的更加清晰.曾经认为上机特别的乱,在一次偶遇中,得知了原来它能够转化成我们平时订餐.以下就听我说一说上机&订餐的故事吧! 又是发生 ...

  5. 【C#】万事开头难(二)&lt;机房重构&gt;

    前言 机房将要进行完了,之所以仍然使用这个题目,是由于我想告诉自己.无论面对多么未知的事物.不要害怕,去做就好.在这么多天的机房重构中,发现了好多问题,也攻克了好多问题,今天,就把我解决的问题分享给大 ...

  6. 机房重构所遇问题&quot;未能载入文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件&quot;的解决的方法集锦

    敲七层登录的时候.忽然间认为敲三层搞清的思路瞬间又凌乱了.花了一天的时间边敲边梳理,最终整完了,执行的时候弹出了这种错误:未能载入文件或程序集"DAL"或它的某一个依赖项. 系统找 ...

  7. 【机房重构】SQL之视图

    近期在重构机房收费系统,越往后就会越感觉到这里很多其它的是对之前学过知识(数据库,设计模式)的一种应用和回想.比方在登录功能中用到了抽象加反射,在学生下机中,我们能够用触发器来同一时候更新两个表.这里 ...

  8. List泛型与DataTable相互转换

    public static class ExtensionMethods{/// <summary>/// 将List转换成DataTable/// </summary>/// ...

  9. 机房重构——UML图最终版本

    刚开始画图时确实很纠结,那时候是在师父的逼迫下不得不画,不过这样也是有好处的,在师父的强烈要求下,我学会了如何使用EA,也对一个学习一个新的软件有了一个更好的方法,可以去找一些视频,或者文字资料来帮助 ...

随机推荐

  1. java:Eclipse插件springsource-tool-suite的下载和安装

    1.打开下载页面http://spring.io/tools/sts/all 找到这个,后补全部版本链接http://spring.io/tools/sts/legacy 插件压缩包下载安装: 链接下 ...

  2. python3 字典属性

    1.字典创建 >>> D={} >>> D {} >>> D2={:,(,):::'d'}} #冒号构造 1.使用 {  }和 : 直接创建 &g ...

  3. java_面试_01_一个月的面试总结(java)

    重点知识 由于我面试的JAVA开发工程师,针对于JAVA,需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程 ...

  4. codeforces 652B B. z-sort(水题)

    题目链接: B. z-sort time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  5. linux命令学习笔记(16):which命令

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...

  6. windows 10 安装 spark 环境(spark 2.2.1 + hadoop2.7)

    安装步骤基本参考 Spark在Windows下的环境搭建.不过在安装新版本 spark2.2.1(基于 hadoop2.7)的配置时,略略有一些不同. 1. sqlContext => spar ...

  7. FFMPEG(一) 从V4L2捕获摄像头数据

    系列相关博文: FFMPEG(一) 从V4L2捕获摄像头数据 FFMPEG(二) v4l2 数据格式装换 FFMPEG(三) v4l2 数据编码H264 最近在学习FFMPEG,发现网上的很多例子都是 ...

  8. bzoj1006神奇的国度

    OrzCDQ您太强辣 #include<iostream> #include<cstdio> #include<cstdlib> #include<algor ...

  9. 51nod 1686 第K大区间 二分瞎搞

    题目: 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 题解: 答案明显单调,我们考虑二分答案. 转化为判定问题后我们需要观察到一个性质: 如果一个区间 ...

  10. HDOJ1024(最大M子段和)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...