利用反射填充对象

反射这东西,包含的内容很多,园子里很多前辈、朋友们也写过很多关于他的文章,今天我就不写那些理论、含义什么(我也就学了点皮毛而已,就不丢人现眼了)

,就简单介绍一下怎么用反射从sql中读取字段并填充对象;

刚学C#的朋友,我想只要你写过学生管理系统、XX系统、等等的时候,都会写这样的代码吧:

 1         /// <summary>
 2         /// 获取城市信息列表
 3         /// </summary>
 4         /// <returns></returns>
 5         public List<CityCode> OldGetCitys()
 6         {
 7             //读取sql中的城市表(这里我用了个封装好的sqlhelper)
 8             SqlDataReader reader = SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["city"].ConnectionString,
 9          CommandType.Text, "select * from dbo.City", null);
10             List<CityCode> list = new List<CityCode>();
11             while (reader.Read())
12             {
13                 CityCode city = new CityCode
14                 {
15                     CityId = (int)reader[0],
16                     ProName = reader[1].ToString(),
17                     CityName = reader[2].ToString(),
18                     Grade = (int)reader[3]
19                 };
20                 list.Add(city);
21             }
22             return list;
23         }

如果数据库中的字段多了,在填充实体类的时候我们是不是要写一大堆的

CityCode city = new CityCode
                {
                    CityId = (int)reader[0],
                    ProName = reader[1].ToString(),
                    CityName = reader[2].ToString(),
                    Grade = (int)reader[3]
                    ...
                };            

这样是不是很累啊,而且每个方法都得这么写

下面就是今天的主题了

 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;

然后再来看我们刚开始写的那个方法要怎么改呢:

 1    public class CityDAL : BaseDAL
 2     {
 3         /// <summary>
 4         /// 获取城市信息
 5         /// </summary>
 6         /// <returns></returns>
 7         public List<CityCode> GetCitys()
 8         {
 9             SqlDataReader reader = SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["city"].ConnectionString,
10                 CommandType.Text, "select * from dbo.City", null);
11             return base.GetTabList<CityCode>(reader);
12         }
13      }

看看,是不是少写了很多代码,而且只要是你查询XX信息,都可以这样简单的调用base里的方法;

由于这篇文章主要是将怎么用反射填充对象(额,我上面写的却是填充泛型对象,其实都差不多),所以有很多细节的地方没有好好处理,只要大家知道怎么使用这个方法就行

好了,就写这么多吧,如果有神马问题或建议,请留言,具体问题具体分析,时间关系我只能到此停笔了,睡觉了明天还得赶公交,o(︶︿︶)o

 

posted @ 2012-09-17 22:54  一抹、思乡泪  Views(1481)  Comments(8Edit  收藏  举报