昨天聽同窗說,要把DataReader對象轉成實體對象,要寫一個通用的方法。想了下用反射應該能夠作到。項目中通常都是用第三方組件來作數據訪問層,如,Nhibernate、ef等。因而本身想寫個簡單例子玩玩。sql
其實,實現起來和簡單。一個泛型方法搞定。代碼以下:ide
1 public List<T> ToList<T>(string _sql) where T :class ,new() 2 { 3 4 using (var conn = new SqlConnection(connStr)) 5 { 6 using (var comm = new SqlCommand(_sql, conn)) 7 { 8 conn.Open(); 9 SqlDataReader dataReader = comm.ExecuteReader(); 10 if (dataReader.HasRows) 11 { 12 List<T> dataList = new List<T>(); 13 14 while ((dataReader.Read())) 15 { 16 T obj = new T(); 17 //獲取泛型對象的全部屬性 18 var properties = obj.GetType().GetProperties(); 19 foreach (var property in properties) 20 { 21 for (int i = 0; i < dataReader.FieldCount; i++) 22 { 23 //查找與屬性名稱相同的列 24 if (dataReader.GetName(i).Equals(property.Name,StringComparison.CurrentCultureIgnoreCase)) 25 { 26 //給新建的obj對象的屬性賦值 27 property.SetValue(obj,dataReader[i]); 28 } 29 } 30 } 31 dataList.Add(obj); 32 } 33 conn.Close(); 34 return dataList; 35 } 36 37 } 38 } 39 return null; 40 }