从SqlHelper到泛型集合(2)
2014-09-10 21:00
148 查看
接上一篇文章---从SqlHelper到泛型集合(1)。
师傅说了,机房重构只允许返回三种类型的值:Boolean,实体,泛型集合。不允许返回DataTable,就想方设法把DataTable转换成实体和泛型集合。当返回一条记录时,可以将DataTable转换成实体;返回多条记录的时呢?总不能一条一条通过实体返回吧?
由此,开始了我的泛型集合之旅。
听到“泛型集合”这个词的时候,我突然想到了《大话设计模式》附录上的泛型,重写阅读此内容,发现了“泛型集合”的身影。
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其形参的类型之一。[MSDN]
参照《大话设计模式》上的例子和一些相关知识,不难写出泛型集合。如下:
泛型集合没有确定的类型,但在使用前必须规定类型。泛型集合大大简化了集合的实现代码,通过它,可以轻松创建指定类型的集合。恰当的运用泛型集合,可以减少很多重复工作,极大的提高开发效率。
师傅说了,机房重构只允许返回三种类型的值:Boolean,实体,泛型集合。不允许返回DataTable,就想方设法把DataTable转换成实体和泛型集合。当返回一条记录时,可以将DataTable转换成实体;返回多条记录的时呢?总不能一条一条通过实体返回吧?
由此,开始了我的泛型集合之旅。
听到“泛型集合”这个词的时候,我突然想到了《大话设计模式》附录上的泛型,重写阅读此内容,发现了“泛型集合”的身影。
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其形参的类型之一。[MSDN]
参照《大话设计模式》上的例子和一些相关知识,不难写出泛型集合。如下:
<span style="font-size:18px;">Imports System.Collections.Generic '增加泛型的命名空间 Imports System.Reflection '引入反射,为了引用PropertyInfo Public Class EntitySetGeneric '将DataTable转换成泛型集合 Public Shared Function ConvertToList(Of T As {New})(ByVal dataTable As DataTable) As IList(Of T) 'ConvertToList(Of T As {New}) 这里的New是用来约束T的,必须有,不然New T的时候会出现错误 Dim myList As New List(Of T) '定义最终返回的集合 Dim myType As Type = GetType(T) '得到实体类的类型名 Dim dataRow As DataRow '定义行集 Dim TmpName As String = String.Empty '定义一个临时变量 '遍历DataTable的所有数据行 For Each dataRow In dataTable.Rows Dim myT As New T '定义一个实体类的对象 Dim propertys() As PropertyInfo = myT.GetType().GetProperties() '定义属性集合 Dim pr As PropertyInfo '遍历该对象的所有属性 For Each pr In propertys TmpName = pr.Name '将属性名称赋值给临时变量 '检查DataTable是否包含此列(列名==对象的属性名) If (dataTable.Columns.Contains(TmpName)) Then '将此属性与DataTable里的列名比较,查看DataTable是否包含此属性 '判断此属性是否有Setter(类) If (pr.CanWrite = False) Then '判断此属性是否可写,如果不可写,跳出本次循环,进入下一次循环;exit for 是退出整个循环 Continue For End If Dim value As Object = dataRow(TmpName) '定义一个对象型的变量来保存列的值 If (value.ToString <> DBNull.Value.ToString()) Then '如果非空,则赋给对象的属性 pr.SetValue(myT, value, Nothing) '在运行期间,通过发射,动态地访问一个对象的属性 End If End If Next myList.Add(myT) '添加到集合 Next Return myList '返回实体集合 End Function End Class </span>
泛型集合没有确定的类型,但在使用前必须规定类型。泛型集合大大简化了集合的实现代码,通过它,可以轻松创建指定类型的集合。恰当的运用泛型集合,可以减少很多重复工作,极大的提高开发效率。
相关文章推荐
- 从SqlHelper到泛型集合(1)
- Java 集合框架 泛型
- Java中的集合、枚举、泛型【上】
- 同时支持二进制(binary)和SOAP (Web Service / WCF) 序列化的泛型集合类型处理
- Dictionary 泛型集合
- 集合的泛型
- javaAPI-集合框架(泛型)
- 体验C#——试试泛型集合
- DataSet和实体,泛型集合
- Java_List Set Map_集合框架 泛型
- c# 泛型集合Dictionary
- C#:泛型集合—Dictionary<K,V>使用技巧
- 泛型集合
- 泛型,集合的根本区别
- 集合使用泛型带来的好处
- 第十六节:集合框架二List与泛型(讲师笔记)
- 泛型和Map集合总结
- SqlHelper 泛型方法,反射,支持实体类
- 黑马程序员—泛型集合
- 黑马程序员——学习日记之泛型和集合框架工具类