作者在 2012-12-05 10:34:45 发布以下内容
反射这东西,包含的内容很多,园子里很多前辈、朋友们也写过很多关于他的文章,今天我就不写那些理论、含义什么(我也就学了点皮毛而已,就不丢人现眼了)
,就简单介绍一下怎么用反射从sql中读取字段并填充对象;
刚学C#的朋友,我想只要你写过学生管理系统、XX系统、等等的时候,都会写这样的代码吧:
/// <summary>
/// 获取城市信息列表
/// </summary>
/// <returns></returns>
public List<CityCode> OldGetCitys()
{
//读取sql中的城市表(这里我用了个封装好的sqlhelper)
SqlDataReader reader = SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["city"].ConnectionString,
CommandType.Text, "select * from dbo.City", null);
List<CityCode> list = new List<CityCode>();
while (reader.Read())
{
CityCode city = new CityCode
{
CityId = (int)reader[0],
ProName = reader[1].ToString(),
CityName = reader[2].ToString(),
Grade = (int)reader[3]
};
list.Add(city);
}
return list;
}
CityCode city = new CityCode
{
CityId = (int)reader[0],
ProName = reader[1].ToString(),
CityName = reader[2].ToString(),
Grade = (int)reader[3]
...
};
这样是不是很累啊,而且每个方法都得这么写;当然你说可以利用vs自带的控件(那是人家封装好的,对里面的字段不好控制),当然你可以说你会神马mvc...利用映射神马...等等
我这篇主要是给那些还在像我上面写的朋友看的,所以大神们要拍砖、路过、是你们的自由,跑题了啊。。。
下面就是今天的主题了
1 public abstract class BaseDAL
2 {
3
4 protected List<T> GetTabList<T>(SqlDataReader reader)
5 where T : class,new()
6 {
7 List<T> list = new List<T>();
8 try
9 {
10 while (reader.Read())
11 {
12 T entity = new T();
13 for (int i = 0; i < reader.FieldCount; i++)
14 {
15 PropertyInfo proinfo = entity.GetType().GetProperty(reader.GetName(i));
16 proinfo.SetValue(entity, reader.GetValue(i), null);//这里最好判断一下reader.GetValue(i)的数据类型,以及在数据库中是否为DbNULL
17 }
18 list.Add(entity);
19 }
20 }
21 catch (Exception ex)
22 {
23
24 throw ex;
25 }
26
27 return list;
28 }
对了还有反射要引用发命名空间:using System.Reflection;
然后再来看我们刚开始写的那个方法要怎么改呢:
public class CityDAL : BaseDAL
{
/// <summary>
/// 获取城市信息
/// </summary>
/// <returns></returns>
public List<CityCode> GetCitys()
{
SqlDataReader reader = SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["city"].ConnectionString,
CommandType.Text, "select * from dbo.City", null);
return base.GetTabList<CityCode>(reader);
}
}
看看,是不是少写了很多代码,而且只要是你查询XX信息,都可以这样简单的调用base里的方法;
由于这篇文章主要是将怎么用反射填充对象(额,我上面写的却是填充泛型对象,其实都差不多),所以有很多细节的地方没有好好处理,只要大家知道怎么使用这个方法就行
原文地址:http://www.cnblogs.com/xhk-yjp/archive/2012/09/17/xhk-yjp.html