利用反射填充對象


反射這東西,包含的內容很多,園子里很多前輩、朋友們也寫過很多關於他的文章,今天我就不寫那些理論、含義什么(我也就學了點皮毛而已,就不丟人現眼了)

,就簡單介紹一下怎么用反射從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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM