對於機房收費系統的重構。從大的方面來看。無非就是對於資料庫的四個操作。增刪改查。而且我們用的是三層架構進行重構。d層用來和資料庫打交道。進行這四個操作就須要有返回值,增刪改在這裡不多說。可是當進行查的時候。d層須要資料給b層,那麼我們以什麼樣的形式返回最好呢?
剛開始接觸三層的時候,我返回的是datatable,就是dt.rows[0][「***」]的形式,感覺實現了。就非常厲害了,後來通過與大家交流發現,事實上另一種更好用的方法。就是利用實體類填充泛型集合。
那麼問題就出來了:
1.泛型集合是什麼?
2.為什麼說用它會更好?
泛型,顧名思義就是泛泛的型別. 也就是沒有確定的型別. 那麼沒有確定型別怎麼使用呢?實際上。使用的時候規定型別即可了.
集合,就是一種處理多個資料型別的類。而且一般你會在多個應用程式中使用同乙個集合的多種不同的形式。你不須要每次依據草稿建立集合,而是使用泛型建立乙個泛型類原型(prototype)。
在使用的時候,依據須要處理的資料型別。將list尖括號裡的t換成相應的型別,並建立相應的例項就能夠使用了.
首先。你須要給**加入例如以下所看到的的
imports
語句:imports system.collections.generic
加入imports
語句之後。你就能夠建立泛型類了。主要的類看起來非經常見。你能夠使用屬性、函式、子程式、欄位或能夠在類中使用的其他不論什麼東西。
public class converthelperentity
public shared function converttolist(of t as )(byval dt as datatable) as ilist(of t)
'將datatable 轉換成泛型集合
dim mylist as new list(of t) '定義終於返回的集合
dim mytype as type = gettype(t) '得到實體類的型別名
dim dr as datarow '定義行集
dim tempname as string = string.empty '定義乙個暫時變數
'遍歷datatable全部資料行
for each dr in dt.rows
dim myt as new t '定義乙個實體類的物件
dim propertys() as propertyinfo = myt.gettype.getproperties() '定義屬性集合
dim pr as propertyinfo
'遍歷該物件的全部屬性
for each pr in propertys
tempname = pr.name '將屬性名稱賦給暫時變數
'檢查datatable 是否包括此列(列名==物件的屬性名)
if (dt.columns.contains(tempname)) then '將此屬性與datatable裡列名相比較。檢視datatable是否包括此屬性
'推斷此屬性是否有setter
if (pr.canwrite = false) then '推斷此屬性是否可寫。假設不可寫。則跳出迴圈
continue for
end if
dim value as object = dr(tempname) '定義乙個物件型的變數來儲存列的值
if (value.tostring <> dbnull.value.tostring()) then '假設非空,則賦給物件的屬性
pr.setvalue(myt, value, nothing) '在執行期間。通過反射,動態的訪問乙個物件的屬性
end if
end if
next
mylist.add(myt) '加入到集合
next
return mylist '返回實體集合
end function
end class
我們須要在實體層,加入乙個實體類,
由於建立集合的基礎是要有類,然後才幹將物件放入集合中。
那麼我們為什麼要說它比datatable要好呢?用泛型集合,我們
在d層把datatable轉換成單個實體類,再把實體類填充到泛型集合中。
其核心思想圖:
將其優缺點進行對照可得:
datatable
list
很easy寫錯,編譯器不檢查
按一下點,自己出來。不會寫錯
必須了解資料庫的結構
不必了解資料庫結構
不符合物件導向思想
符合物件導向思想
datatable為弱型別。無法直觀的看出欄位的資料型別。
實體類的屬性是強型別,每乙個欄位的型別都是已知的。
通過學習泛型集合,真正的了解了,乙個程式實現功能或許不是最重要的。如何使**最簡單,易擴充套件,如何做到最能為他人著想,才是我們要去做的。
泛型集合,非泛型集合
arraylist 非泛型集合 list 泛型集合 集合跟陣列比較我們更容易理解。陣列 1,長度固定2,資料型別預先宣告 集合 1,長度可變2,資料型別預先宣告的為泛型集合,資料型別不限定為非泛型 arraylist 長度不固定,元素資料型別為object的集合。object類之間或間接為所有類的父...
C 泛型 泛型集合Dictionary
在system.collections.generic命名空間中,與arraylist相對應的泛型集合是list,與hashtable相對應的泛型集合是dictionary,其儲存資料的方式與雜湊表相似,通過鍵 值來儲存元素,並具有泛型的全部特徵,編譯時檢查型別約束,讀取時無須型別轉換。本儲存的例子...
泛型在集合上的使用
1.泛型 一般用在集合上 比如把乙個集合裡面的值放在乙個集合裡,這個時候,這個值放入集合之後,失去本身的型別,只能是object型別 這個時候,想要對這個值進行型別轉換,很容易出現型別轉換錯誤,這個時候就可以使用泛型來解決這個問題 在集合上如何使用?常用集合 list set map 泛型語法 集合...