重构——DataTable转泛型
泛型简单介绍
泛型能够最大限度的重用代码、保护类型的安全、提高性能。
泛型最常见的用途是创建集合类
泛型数据类型中使用的信息可在执行时通过反射获取。
能够创建自己的泛型接口、泛型类、泛型方法、泛型事件、泛型托付。
个人理解
我所使用使用的泛型是一个list<>集合。仅仅是集合中的每个元素都是一个实体,而每个实体都相当于DataTable中的一条记录。DataTable是多条记录的集合,而list<>是多个实体的集合。
什么要转泛型?
1、list<T>遍历方便,取到的都是单个的实体。
2、降低输入,仅仅须要传一个实例T就能够获取它的不论什么属性。
3、正确的构建泛型类,能够降低代码中的安全问题。
4、泛型确保了在工作量最小的情况下,为应用程序提供最佳的性能。
泛型实例
以充值为例,实战一下将DataTable转换为泛型,首先我们在D层创建一个类ConverHelper,用于将DataTable转换为泛型。
<span style="font-size:18px;"><strong>Imports System.Reflection '引用反射
Imports System.Collections.Generic
Module ConverHelper
Public Class ConverHelper
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的类型
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
'列名=对象的属性名
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
End While
'加入对象到泛型集合中
ts.Add(act)
Next
Return ts
End Function
End Class
End Module
</strong></span>
D层中充值窗口调用这个类
<span style="font-size:18px;"><strong> dt = sqlhelper.ExecSelect(str, CommandType.Text, sqlparamsnew)
If (dt.Rows.Count > 0) Then
list = ConverHelper.ConverHelper.ConvertToList(dt, list)
Return list
Else
Throw New Exception("没有记录!")
End If</strong></span>
此时,D层的返回值类型
<span style="font-size:18px;"><strong> List(Of Entity.RechargeEntity)</strong></span>
事实上当我们接触一些新东西的时候,它可能并没有想象中的那么难,仅仅要去做就能够了。
重构——DataTable转泛型的更多相关文章
- [工具类]DataTable与泛型集合List互转
写在前面 工作中经常遇到datatable与list,对于datatable而言操作起来不太方便.所以有的时候还是非常希望通过泛型集合来进行操作的.所以这里就封装了一个扩展类.也方便使用. 类 方法中 ...
- DataReader,DataTable利用泛型填充实体类
using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...
- DataTable转实体Model,DataRow转实体Model,DataTable转泛型T,DataRow转泛型T
前言,此方法利用反射将DataRow转成实体,由于反射性能不行,大家就看看就行了吧. 代码来啦 using System; using System.Collections.Generic; usin ...
- 把DataTable转换为泛型List<T>或是JSON
在开发ASP.NET Web API或ASP.NET MVC时,我们从数据库得到的数据往往是DataSet或是DataTable.为了能让前端JQuery能方便使用至这些数据,我们需要把这些数据转换为 ...
- DataTable转泛型List
在.net项目研发过程中,有时候需要将从数据库中获取的DataTable数据类型,转换为泛型集合,然后运用LINQ对集合进行操作,我将此总结一下,方便你我他. 核心类: public class Da ...
- C#中DataTable与泛型集合互转(支持泛型集合中对象包含枚举)
最近在做WCF,因为是内部接口,很多地方直接用的弱类型返回(DataSet),这其实是一种非常不好的方式,最近将项目做了修改,将所有接口返回值都修改成强类型,这样可以减少很多与客户端开发人员的沟通,结 ...
- C#如何根据DataTable生成泛型List或者动态类型list
背景:在项目中,sql语句检索返回DataTable,然后根据检索结果做进一步的操作,本篇文章即是介绍如何将DataTable快速生成泛型List返回. 假设存在如下学生类: public class ...
- 机房重构——泛型和“DataTable”
前言 我们都知道在机房重构的时候,大多数都在用七层进行重构,每一层都依赖实体.所以不管怎么调用,返回的应该是实体参数,这样才符合大多数的逻辑,这样我们试想一下,如果我们要求在U层返回多个实体值,怎么办 ...
- List泛型与DataTable相互转换
public static class ExtensionMethods{/// <summary>/// 将List转换成DataTable/// </summary>/// ...
随机推荐
- android framework 01
.(由下向上启动),Uboot引导内核(linux Kernel)启动,把内核从flash放到内存中,引导内核启动.内核是系统的核心,负责进程的管理内存的管理网络的管理.内核(Linux Kenel) ...
- SQL Server performance for alter table alter column change data type
最近在搞一个升级脚本,发现有一张业务表中的某些字段长度需要调整,直接使用alter table alter column进行修改发现修改一列要用十几分钟!!!两三个列那用时简直不能容忍啊!google ...
- onvif开发总结
ONVIF开发经验总结 ONVIF开发经验总结............................................................................. ...
- Java中join和yield的作用
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1. A.join,在API中的解释是,堵塞当前线程B,直到A执行完毕并死掉,再执行B. 用一个 ...
- ubuntu-查看iso文件的md5
直接使用命令md5sum +文件名就可以了.例如 md5sum ~/YLMF_GHOSTWIN7SP1_X86_YN2015.iso 执行结果如下 cdbb7fdc8bbc30e5e0a398f71b ...
- 【编程】概念的理解 —— socket
socket:A socket is something into which something is plugged or fitted (also called a receptacle). A ...
- mysql 表设计时的update_time自动更新
11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME 原文地址:https://dev.mysql.com/d ...
- JVM 基础知识(GC)
几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西.突然发现,基础真的很重要.学习的过程是一个由表及里,再由里及表的过程,所谓的"温故而知新".而真正能走完 ...
- Codefroces 832B Petya and Exam
B. Petya and Exam time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- jmeter分布式测试的坑(转)
本文转自:https://www.cnblogs.com/lsjdddddd/p/5806077.html 有关jmeter分布式测试的环境配置,大概就是那样,但是每次想要进行jmeter分布式测试的 ...