利用反射填充对象
反射这东西,包含的内容很多,园子里很多前辈、朋友们也写过很多关于他的文章,今天我就不写那些理论、含义什么(我也就学了点皮毛而已,就不丢人现眼了)
,就简单介绍一下怎么用反射从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