反射這東西,包含的內容很多,園子里很多前輩、朋友們也寫過很多關於他的文章,今天我就不寫那些理論、含義什么(我也就學了點皮毛而已,就不丟人現眼了)
,就簡單介紹一下怎么用反射從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