反射入门-浅谈反射用途_根据Ado游标对象创建list集合
本人大二菜鸟一只,今天在上课期间有个同学看着C#反射的内容说反射没什么用,一时之间也想不到什么更好的例子,就写了个根据泛型类型和游标反射创建List集合的Demo.
首先创建一个用于封装对应数据的entity,代码如下.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { public class EUserInfo { public int UserId { get; set; } public string UserCode { get; set; } public string UserName { get; set; } public string UserPwd { get; set; } public string Gender { get; set; } public override string ToString() { return "UserId:"+UserId+"|UserCode:"+UserCode+"|UserName:"+UserName+"|UserPwd:"+UserPwd+"|Gender:"+Gender; } } }
这里我重写了ToString方法,以便待会儿更直观的看到效果.
接下来创建EUserInfo实体类对应的table,sql如下:
use master go if exists (select * from sys.databases where name='reflectDemoDB') drop database reflectDemoDB create database reflectDemoDB go use reflectDemoDB go create table UserInfo( UserId int primary key identity, UserCode ) not null, UserName ) not null, UserPwd ) not null, Gender ) check(Gender in ('男','女')) ) go ','男') ','男') ','男')
为了可以方便操作ado对象我这里写了一个工具类DBHelper,代码如下:
using System; using System.Collections.Generic; using System.Web; using System.Data.SqlClient; using System.Data; using System.Configuration; namespace Test { /// <summary> ///DBHelper:数据库访问操作类 /// </summary> public class DBHelper { /// <summary> /// 更新操作:增,删,改 共用 /// </summary> /// <param name="sql"></param> /// <returns>bool</returns> public static bool UpdateOpera(string sql,params SqlParameter[] sps) { SqlCommand cmd = new SqlCommand(sql, Connection); //////////////////将配置参数加入到Command中 cmd.Parameters.AddRange(sps); ///////////////// ; } /// <summary> /// 单个查询操作:返回首行首列数据 /// </summary> /// <param name="sql">查询SQL语句</param> /// <returns>object</returns> public static object GetScalar(string sql, params SqlParameter[] sps) { SqlCommand cmd = new SqlCommand(sql, Connection); //////////////////将配置参数加入到Command中 cmd.Parameters.AddRange(sps); ///////////////// return cmd.ExecuteScalar(); } /// <summary> /// 多行查询操作:返回SqlDataReader /// </summary> /// <param name="sql">查询SQL语句</param> /// <returns>SqlDataReader</returns> public static SqlDataReader GetReader(string sql, params SqlParameter[] sps) { SqlCommand cmd = new SqlCommand(sql, Connection); //////////////////将配置参数加入到Command中 cmd.Parameters.AddRange(sps); ///////////////// return cmd.ExecuteReader(); } /// <summary> /// 多行查询操作:返回DataTable /// </summary> /// <param name="sql">查询SQL语句</param> /// <returns>DataTable</returns> public static DataTable GetDataTable(string sql, params SqlParameter[] sps) { DataTable dt = new DataTable(); SqlDataAdapter dad = new SqlDataAdapter(sql, Connection); //////////////////将配置参数加入到Command中 dad.SelectCommand.Parameters.AddRange(sps); ///////////////// dad.Fill(dt); return dt; } public static List<string> GetColumnsByTableName(string tableName) { List<string> columnList = new List<string>(); string sql = "select name from syscolumns where id=object_id(@tableName)"; SqlDataReader sdr = GetReader(sql, new SqlParameter("@tableName", tableName)); while (sdr.Read()) { columnList.Add(sdr["name"].ToString()); } sdr.Close(); return columnList; } private static SqlConnection _connection; /// <summary> /// Connection对象 /// </summary> public static SqlConnection Connection { get { string connectionString = "Data Source=.;Initial Catalog=reflectDemoDB;Integrated Security=True"; if (_connection == null) { _connection = new SqlConnection(connectionString); _connection.Open(); } else if (_connection.State == ConnectionState.Closed) { _connection.Open(); } else if (_connection.State == ConnectionState.Broken || _connection.State == ConnectionState.Open) { _connection.Close(); _connection.Open(); } return _connection; } } } }
接下来就可以进入主题了,我这里是用一个BaseDao做例子,代码如下:
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Test { public class BaseDao<T> { /// <summary> /// 获取泛型对应的实体类类名当做表名 /// </summary> private static string TableName { get { return typeof(T).Name.Replace("E",""); } } /// <summary> /// 获取泛型对应实体类所有属性 /// </summary> private static PropertyInfo[] Properties { get { return typeof(T).GetProperties(); } } /// <summary> /// 通用查询所有方法 /// </summary> /// <returns></returns> public List<T> GetAll() { //根据获取的表名拼装出sql语句 string sql = "select * from " + TableName; SqlDataReader sdr = DBHelper.GetReader(sql); return CreateInstanceListOfSqlDataReader<T>(sdr); } private static T CreateInstance<T>(SqlDataReader sdr) { //或许泛型类所有属性 //根据泛型T创建它的实例 T t = (T)Activator.CreateInstance(typeof(T)); //遍历该类所有属性 foreach (PropertyInfo pro in Properties) { //判断属性类型 如果是对应类型就强转进行赋值 if (pro.PropertyType.Equals(typeof(DateTime))) try { pro.SetValue(t, Convert.ToDateTime(sdr[pro.Name]));//利用游标根据属性名获取对应列值给属性赋值 } catch (Exception) { throw new Exception("转换DateTime类型失败,[" + pro.Name + "]字段[value=" + sdr[pro.Name].ToString() + "]格式不正确"); } else if (pro.PropertyType.Equals(typeof(int))) try { pro.SetValue(t, Convert.ToInt32(sdr[pro.Name])); } catch (Exception) { throw new Exception("转换int类型失败,[" + pro.Name + "]字段[value=" + sdr[pro.Name].ToString() + "]格式不正确"); } else if (pro.PropertyType.Equals(typeof(double))) try { pro.SetValue(t, Convert.ToDouble(sdr[pro.Name])); } catch (Exception) { throw new Exception("转换Double类型失败,[" + pro.Name + "]字段[value=" + sdr[pro.Name].ToString() + "]格式不正确"); } else pro.SetValue(t, sdr[pro.Name]); } return t; } /// <summary> /// 根据游标sdr创建一个所传类型对象集合并返回 /// </summary> /// <typeparam name="T">泛型类型</typeparam> /// <param name="sdr">游标</param> /// <returns></returns> private List<T> CreateInstanceListOfSqlDataReader<T>(SqlDataReader sdr) { List<T> tList = new List<T>(); while (sdr.Read()) { T t = CreateInstance<T>(sdr); tList.Add(t); } return tList; } } }
BaseDao写好以后我们就可以看看效果了,接下来我们创建一个UserInfoDao,来继承BaseDao,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { public class UserInfoDao:BaseDao<EUserInfo>{} }
然后我们就可以开始测试了,下面是测试代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { class Program { static void Main(string[] args) { UserInfoDao userInfoDao = new UserInfoDao(); List<EUserInfo> userInfoList = userInfoDao.GetAll(); foreach (EUserInfo userInfo in userInfoList) { Console.WriteLine(userInfo); } Console.ReadKey(); } } }
这里我们可以直接调用BaseDao的GetAll方法,sql会自动在BaseDao中帮我们拼装好,得到的结果如下:
这里我们可以看见的效果是BaseDao帮我们把数据库中表的数据封装到了对象中.不需要我们手动的来进行实例化赋值,希望这个Demo能对初学反射的有点启发,有什么不足之处大家多多指教.
反射入门-浅谈反射用途_根据Ado游标对象创建list集合的更多相关文章
- java反射机制浅谈
一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- 【C#】:浅谈反射机制 【转】
http://blog.csdn.net/lianjiangwei/article/details/47207875 什么是反射? 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反 ...
- 【转】Windows SDK入门浅谈
前言 如果你是一个编程初学者,如果你刚刚结束C语言的课程.你可能会有点失望和怀疑:这就是C语言吗?靠它就能编出软件?无法想象Windows桌面上一个普通的窗口是怎样出现在眼前的.从C语言的上机作业到W ...
- c#浅谈反射内存的处理
这段时间由于公司的项目的要求,我利用c#的反射的机制做了一个客户端框架.客户端里的所有的模块都是以一定形式进行提供,例如:FORM,UserControl. 在做的过程中很简单与愉快.具体的过程如下: ...
- 05 入门 - 浅谈 ASP.NET MVC程序的工作原理
目录索引:<ASP.NET MVC 5 高级编程>学习笔记 本篇内容 1. Global.asax文件 2. RouteConfig.cs文件 3. 视图命名和寻址的规则 前面创建了一个简 ...
- ChromeExtension入门浅谈
0.写在前面的话 朋友上班时每天好几个时段都有个客流信息需要汇报到微信里,都是照着网页上的数据手动填写,着实麻烦.所以给写了个简单的函数每次到控制台里去运行,但是体验也并不好,今天就花了一整天的时间鼓 ...
- 编程基础系列--之--浅谈List、Set、Map和泛型(一)——单列集合
之前在学习Java时对于泛型,集合的理解一直模模糊糊,随着时间的推移,对泛型和集合有了一些浅显的认知,打算写出来巩固一下,也希望各位大佬能指出理解不当之处,万分感谢!!! 在Java语言中,集合分为两 ...
- Salesforce Consumer Goods Cloud 浅谈篇四之店内拜访的创建和执行
本篇参考: https://v.qq.com/x/page/f0772toebhd.html https://v.qq.com/x/page/e0772tsmtek.html https://v.qq ...
随机推荐
- javascript +new Date()
最近学习JavaScript时,看到Date的一个有意思的用法就是+new Date(),结果跟Date对象的getTime(),valueOf()是一样的,他们返回的都是1970年1月1日午夜以来的 ...
- juypter安装使用
安装: pip install jupyter 启动: jupyter notebook 创建文件 这里的python文件格式是ipynb,可以在download as 中选择要保存的格式. 执行: ...
- SpringBoot Docker Mysql安装,Docker安装Mysql
SpringBoot Docker Mysql安装,Docker安装Mysql ================================ ©Copyright 蕃薯耀 2018年4月8日 ht ...
- Unity3D Shader 模型流光效果
Shader "Custom/FlowColor" { Properties { _MainTex ("Base (RGB)", 2D) = "whi ...
- 用开源项目ActivityOptionsICS让ActivityOptions的动画实现兼容
我之前写过一篇文章是讲解ActivityOption的api方法的(http://www.cnblogs.com/tianzhijiexian/p/4087917.html),当时吐槽各种动画不兼容, ...
- 【react】---styled-components的基本使用---【巷子】
一.官网地址 https://www.styled-components.com/ 二.styled-components 1.styled-components 样式化组件,主要作用是它可以编写实际 ...
- Django----认证系统和auth模块
COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...
- IAR 路径导致的错误
Error while running "c:\ti\simplelink_cc2640r2_sdk_1_50_00_58\..\xdctools_3_50_03_33_core\xs&qu ...
- [No0000CD]shell 中的单行注释和多行注释
1. 单行注释 众所周知,# 比如想要注释:echo “ni” # echo "ni" 2. 多行注释 法一: : << ! 语句1 语句2 语句3 语句4 ! 例如 ...
- Vitrual Box设置linux网络连接到外网
Vitrual Box设置linux网络连接到外网 在虚拟机上安装好linux系统之后,经常会碰到ping不通www.baidu.com的情况,此时的情况多半是网络配置上的错误,linux在网络配置有 ...