利用反射填充对象

作者在 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

.Net基础 | 阅读 1444 次
文章评论,共0条
游客请输入验证码
浏览3003次
最新评论