反射入门-浅谈反射用途_根据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 ...
随机推荐
- jar各个版本号的意义
jar版本号的意义: Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用.是希腊字母的第一位,表示最初级的版本,alpha 就是α,beta 就 ...
- Android 集成ShareSDK分享QQ或空间成功后,回调却不执行的原因
AndroidMainifest.xml中的如箭头所示的id一定要与assets下ShareSDK.xml中配置的QQ的AppId一定要相同. 如下图
- chrome调试创建sq设备进行调试
工作中开发基于手机qq的webapp页面时,通常开发会对页面进行限制让用户通过手机qq访问,进行引导,如下图所示. 很多时候我们开发只是在手机展示,而在pc端进行调试,当开发加了这一层限制之后,就会导 ...
- Mac下利用Cordova打包 iOS App以及出现的问题
安装 cordova sudo npm install cordova 创建项目 创建一个demo文件夹,里面自动加载基本的文件以及目录 cordova create demo com.test.de ...
- Python 读、写、追加csv文件详细以及注意事项
一.利用csv库创建文件 首先导入csv文件 import csv 根据指定的path创建文件: def create_csv(path): with open(path, "w+" ...
- 数据库高分笔记01:事务ACID
作者:arccosxy 转载请注明出处:http://www.cnblogs.com/arccosxy/ 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎能够成功地对数据库应 ...
- 解决css设置背景透明,文字不透明
设置元素的透明度: -moz-opacity:0.8; /*在Firefox中设置元素透明度 filter: alpha(opacity=80); /*ie使用滤镜设置透明 但是当我们对一个标 ...
- dts的pci模块中bus-range和ranges
bus-range = <2 3>; 该设备(一般为RC)下的pci总线号范围 ranges = <0x2000000 0x0 0xc0000000 0 0xc00000 ...
- Adobe Photoshop CS6简单的破解
由于网站的页面布局和素材准备等等需要用到Photoshop,所以下载了个 Photoshop CS6,写这份破解文档的大佬感觉写的很复杂,看了让人头疼,乱搞中突然发现一个方法可以很快的进行破解操作,我 ...
- href='#' 和 href='###'
如果想定义一个空的链接,又不跳转到页面头部,可以写href="###". 详细解释就是'#' 是有特定意义的,如果 '#' 后有内容会被认为是一个标签而从页面找到相应标签跳转到该处 ...