CN.Text开发笔记—利用反射将数据读入实体类
在實際開發中,我們經常需要從數據庫中讀取數據并賦值給實體類的相應屬性。在.Text的DataDTOProvider中存在大量這樣的代碼, 比如:
????????{
????????????System.Collections.ArrayList?al=new?System.Collections.ArrayList();
????????????IDataReader?reader=DbProvider.Instance().GetRoles(BlogID);
????????????try
????????????{
????????????????while(reader.Read())
????????????????{
????????????????????Role?role=new?Role();
????????????????????if(reader["RoleID"]!=DBNull.Value)
????????????????????{
????????????????????????role.RoleID=(int)reader["RoleID"];
????????????????????}
????????????????????if(reader["Name"]!=DBNull.Value)
????????????????????{
????????????????????????role.Name=(string)reader["Name"];
????????????????????}
????????????????????if(reader["Description"]!=DBNull.Value)
????????????????????{
????????????????????????role.Description=(string)reader["Description"];
????????????????????}
????????????????????//ReaderToObject(reader,role);
????????????????????al.Add(role);
????????????????}
????????????}
????????????finally
????????????{
????????????????reader.Close();
????????????}
????????????return?(Role[])al.ToArray(typeof(Role));
????????
????????}
對于上面的代碼,我覺得有幾點不優雅之處:
1、每次對Role的屬性進行賦值時,都要檢查reader的值是否為DBNull,出現了很多重復代碼
2、每次對Role的屬性進行賦值時,都要進行類型轉換, 而Role屬性的類型是已知的,是不是可以自動完成這樣的轉換?
3、每次對Role的屬性進行賦值時,都要進行Role屬性與數據庫字段的對應。如果我們在設計數據庫與實體類時,保證數據庫字段與實體類屬性采用同樣的名稱,那利用反射,我們可以通過代碼自動進行屬性與字段的對應。即使數據庫字段與屬性不同名,我們也可以通過更改查詢語句,來做到這一點。
是不是可以對上面的代碼進行改進,使代碼變得更優雅?那優雅的代碼應該是什么樣的呢?如果我們用上面代碼中注釋的代碼行ReaderToObject(reader,role);取代它之前的對Role屬性進行賦值的語句,是不是會使代碼變得更優雅?ReaderToObject的作用就是自動完成將reader中的值寫入到role中對應的屬性中(前提是reader中的字段與role中對應的屬性具有相同的名稱)?,F在我們的任務就是實現ReaderToObject, 有了強大的武器—Reflection,我們的任務就變得很輕松, 也不多說了,下面的代碼是我的實現方法:
????????{
????????????for(int?i=0;i<reader.FieldCount;i++)
????????????{
????????????????System.Reflection.PropertyInfo?propertyInfo=targetObj.GetType().GetProperty(reader.GetName(i));
????????????????if(propertyInfo!=null)
????????????????{
????????????????????if(reader.GetValue(i)!=DBNull.Value)
????????????????????{
????????????????????????propertyInfo.SetValue(targetObj,reader.GetValue(i),null);
????????????????????}
????????????????}
????????????}
????????}
ReaderToObject可以將reader中的數據讀入到任何實體類中。數據庫字段與實體類屬性的映射原則是名稱相同。當然,我們也可以通過配置文件來進行兩者映射。
????個人想法:在開發中,面對那么多設計思想和設計模式,常常令人感到迷惑,當你把更多的精力放在選用哪個設計思想或設計模式時,我覺得不要忽略很重要的一點,盡可能地減少重復代碼,只要我們能有效地減少重復代碼,我們采用的方法就是好方法,而不要太在乎采用了哪種模式。就像獨孤九劍,正因為擺脫了傳統招式的束縛,才能戰無不勝!
總結
以上是生活随笔為你收集整理的CN.Text开发笔记—利用反射将数据读入实体类的全部內容,希望文章能夠幫你解決所遇到的問題。