C#反射在ADO中的巧用
? ? ?在C#原生開發網站的時候,經常會碰到一個問題,后臺用原生查出來的數據一般是DataReader或者是DataTable,這樣就把數據從數據庫中拿到了,然后就是把數據綁定到前臺頁面進行輸出,這是最原生態的開發了。然后慢慢的接觸到了三層架構了,一番流程下來后,感覺三層架構相比之下確實是規范了不少,先從數據庫說,原來從數據庫查出來返回到內存的是一個DataTable,然后在前臺進行解析解析再解析,DataTable -- Column --- Row -- Cells ,在三層架構呢 ,返回一個List<>集合,我把它叫做對象數組,就是存放一種對象類型的集合,我們都知道List<>集合實現了IEumerable這個接口,SO,我們可以用foreach了然后調用model的屬性,進行輸出,上代碼:
?
foreach (var item in List<User>){Response.Write(item.id);}
那么問題來了,DataTable <-----> Model 這個轉化改怎么進行呢,剛開始有一種笨方法,就是先把DataTable循環出來,然后再給Model實體的屬性依次賦值,然后就這時的數據就變成了Model 里面的屬性了,是不是特笨,后來老師講了反射,然后就想到了這個方法,以前一大堆代碼的事,現在一個方法搞定,先大概看下代碼:
?
public static List<FanShe> Map<FanShe>(DataTable dt) where FanShe :class,new() {List<FanShe> list = new List<FanShe>();var prop = typeof(FanShe).GetProperties();int count = dt.Rows.Count;for (int i = 0; i < count; i++){FanShe f = new FanShe();foreach (var item in prop){item.SetValue(f,dt.Rows[i][item.Name],null);}list.Add(f);}return list;}這樣就省事多了,DataDable ----> Map<>() ---->Model ,傳入方法一個DataTable然后就你直接拿個List<User> users 接收就ok了,是不是很爽,其實效率就是這樣慢慢高起來的,有些很繁瑣和重復的東西,如果能夠有一種自動化的方案去解決的,那肯定是絕佳了,好了,先分析下代碼:
為什么DataTable能轉化成Model實體呢 ,其實稍微想一下,就明白了,DataTable中的行和列,對應的就是Model實體的屬性和Count,然后在經過C#的反射,方法就成了。
?
public static List<FanShe> Map<FanShe>(DataTable dt) where FanShe :class,new()方法后面的這個Where是方法的約束,具體就不多說了
?
var prop = typeof(FanShe).GetProperties();這一句先拿到FanShe的數據類型,他可以是User 也可以是Student ,調用方法拿到這個類型class的所有屬性,prop是一個屬性的數組,然后思路就有了
item.SetValue(f,dt.Rows[i][item.Name],null);先foreach prop這個屬性集合,拿到的就是Id,Name,Tiele之類的,然后在Foreach DataTable,DataTa的取值可以是 Dt.Rows[0] 也可以是Dt.Rows["Id"] ,正是利用第二種方法,屬性名和DataTable的行的名字相同,然后就是for循環,走了一圈又一圈,這樣Model實體就出來了。
?
轉載于:https://www.cnblogs.com/myshowtime/p/5392109.html
總結
以上是生活随笔為你收集整理的C#反射在ADO中的巧用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 串行口应用
- 下一篇: 如何添加团队成员,并为团队成员分配访问权