【C#】泛型<机房重构>
来源:互联网 发布:linux 红底白字 编辑:程序博客网 时间:2024/04/30 06:36
前言
我们都知道,在机房重构中,刚开始看的三层视频,返回值类型是实体,后来用了SqlHelper,返回值类型就变成了Datatable,那这些,和今天要说的泛型有什么关系呢?或者说,我们为什么要大费周折的去用泛型呢?
原理
实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,存放到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。
优点
1、 编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。
2、不必了解数据库结构。
3、符合面向对象思想。
4、实体类的属性是强类型,每个字段的类型都是已知的。
注意事项
1、实体类的属性名必须和数据库表中的字段名一模一样。
2、想用这种方法把DataTable转换成实体类,必须有已知的实体类和DataTable中的数据相对应,也就是说必须明确你要转换成的实体类类型,否则没办法指定泛型集合的类型,也就没办法调用。
3、各个表的字段尽量区别开来,不要相同。比如A表有个name字段,B表也有一个name字段,就不合理了。
参考代码
说了这么多,那么,到底如何来实现Datatable转泛型呢?我们先看代码。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Collections; using System.Reflection; namespace SqlDAL{ public class ConvertHelper { public List<T> convertToList<T>(DataTable dt) where T : new() { // 定义集合 List<T> ts = new List<T>(); // 获得此模型的类型 Type type = typeof(T); //定义一个临时变量 string tempName = string.Empty; //遍历DataTable中所有的数据行 foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); //遍历该对象的所有属性 foreach (PropertyInfo pi in propertys) { tempName = pi.Name;//将属性名称赋值给临时变量 //检查DataTable是否包含此列(列名==对象的属性名) if (dt.Columns.Contains(tempName)) { // 判断此属性是否有Setter if (!pi.CanWrite) continue;//该属性不可写,直接跳出 //取值 object value = dr[tempName]; //如果非空,则赋给对象的属性 if (value != DBNull.Value) pi.SetValue(t, value, null); } } //对象添加到泛型集合中 ts.Add(t); } return ts; } } }这个是由datatable转为泛型的ConvertHelper,这个是通用的,又有小伙伴问了,那么我在D层该怎么写呢?
DataTable table =SqlDAL.SQLHelper.GetDataTable(sql, CommandType.Text, sqlParams);//调用SqlHelper中的有返回值的方法 if (table.Rows.Count > 0) { ConvertHelper ctl = new ConvertHelper(); List<Entity.UserInfo> list = new List<Entity.UserInfo>(); list = ctl.convertToList<Entity.UserInfo>(table); return list; } else { return null; }好了,泛型已经转换成功了,在U层中,我们需要将泛型集合中的数据调出来
txtRate.Text = list[0].Rate.ToString();txtTmpRate.Text = list[0].TmpRate.ToString();txtPrepare.Text = list[0].PrepareTime.ToString();txtLimit.Text = list[0].LimitCash.ToString();lblModUser.Text = list[0].Head.ToString();这个就是我U层将数据取出的代码。
总结
想要做出来一个功能,有很多方法,我们的任务不仅仅是掌握这些方法,更重要的是分析这些方法,区别这些方法,找到它们各自的优缺点,这样才能更好的使用这些方法。
0 0
- 【C#】泛型<机房重构>
- 【C#】DataGridView<机房重构>
- 【机房重构】泛型
- 【机房重构】泛型
- 【C#】三层登录总结<机房重构>
- 【C#】三层登录<机房重构>
- 【C#】七层登录<机房重构>
- 【C#】万事开头难(一)<机房重构>
- 【C#】单例模式<机房重构>
- 【C#】报表制作<机房重构>
- 【C#】万事开头难(二)<机房重构>
- 【C#】导出excel表<机房重构>
- 【C#】日期转换函数<机房重构>
- 【C#】万事开头难(三)<机房重构>
- 【机房重构】——泛型
- 【机房重构】总结
- 机房重构总结
- 机房重构小结
- android使用隐藏api的方法(使用被@hide的api)
- OSTS submission
- A-Again Twenty Five!
- 如何在Ubuntu上搭建Spark独立集群管理器(Spark快速大数据分析)
- UI自动化测试的初始化操作。
- 【C#】泛型<机房重构>
- 单元测试
- Java十类面试题<中英版>
- 杭电1019
- 代理设计模式 && block设计模式 && KVC\KVO
- php变量
- 第二周项目1-宣告“主权”
- 算两个日期相差多少天,杭电1201(18岁生日多少天)类似
- dispatch_source