菜鳥類庫誕生記二:經過反射轉換DataRow爲對象

雖然大數據量的環境下,經過反射轉換DataRow爲對象性能會很低,可是在數據量適中的時候,這樣可以減小不少的代碼量,性能也確實不錯。html

因此在數據量不是很大的狀況下,推薦使用。post

若是數據量很大,能夠使用Emit來提升性能,最近也在研究它,網上也有不少這方面的資料。性能

我定義了一個DataRow的擴張方法,以下:大數據

 1 using System;
 2 using System.Data;
 3 using System.Reflection;
 4 
 5 namespace YCG.FCL.Common.ExtensionMethods
 6 {
 7     public static class DataRowExtension
 8     {
 9         /// <summary>
10         /// Convert data row to corresponding model..
11         /// </summary>
12         /// <typeparam name="T">Model</typeparam>
13         /// <param name="dataRow">Data Row.</param>
14         /// <returns>Model Object.</returns>
15         public static T GenerateInfo<T>(this DataRow dataRow) where T : class ,new()
16         {
17             if (dataRow == null) throw new ArgumentNullException();
18             T t = new T();
19             Type type = typeof(T);
20             PropertyInfo[] propertyInfos = type.GetProperties();
21             foreach (PropertyInfo propertyInfo in propertyInfos)
22             {
23                 string propertyName = propertyInfo.Name;
24                 if (dataRow.Table.Columns.Contains(propertyName))
25                 {
26                     object value = dataRow[propertyName];
27                     if (value != null && value != DBNull.Value)
28                     {
29                         if (propertyInfo.PropertyType.IsEnum)
30                         {
31                             propertyInfo.SetValue(t, Enum.Parse(propertyInfo.PropertyType, value.ToString()), null);
32                             //propertyInfo.SetValue(t, Enum.ToObject(propertyInfo.PropertyType, value.ToInt32()), null);
33                         }
34                         else
35                         {
36                             switch (propertyInfo.PropertyType.Name)
37                             {
38                                 case "Int32":
39                                     propertyInfo.SetValue(t, value.ToInt32(), null);
40                                     break;
41                                 case "DateTime":
42                                     propertyInfo.SetValue(t, value.ToDateTime(), null);
43                                     break;
44                                 case "Boolean":
45                                     propertyInfo.SetValue(t, value.ToBool(), null);
46                                     break;
47                                 case "Double":
48                                     propertyInfo.SetValue(t, value.ToDouble(), null);
49                                     break;
50                                 //case "Byte[]":
51                                 //    propertyInfo.SetValue(t, value.ToBytes(), null);
52                                 //    break;
53                                 default:
54                                     propertyInfo.SetValue(t, value, null);
55                                     break;
56                             }
57                         }
58                     }
59                 }
60             }
61             return t;
62         }
63 
64         public static T GenerateInfo<T>(this DataRow dataRow, Func<DataRow, T> func) where T : class,new()
65         {
66             if (dataRow == null) return new T();
67             return func(dataRow);
68         }
69     }
70 }

 

好了,就這麼多了。ui

最近在設計數據訪問層,真的只有當本身動手去作的時候,才知道本身知識的侷限性,可能要到過年以前才能完整的設計好。this

因此關於這方面的文章還要過段時間才能寫出來。url

 

以同步至:我的文章目錄索引spa

相關文章
相關標籤/搜索