ConvertHelper與泛型集合

2021-06-26 16:47:03 字數 3154 閱讀 4642

在機房重構時,我們經常會用到converthelper。它把從資料庫中查詢到的datetable(也是乙個臨時表)轉化為泛型,然後再填充到datagridview控制項中。converthelper類有兩點體現了物件導向的思想。一是因為它是經常被使用而被封裝起來的類;二是因為它的返回值是泛型集合,泛型集合使儲存資料時靈活而安全,也體現了物件導向的思想。

一開始接觸converthelper,以為它和sqlhelper一樣,後來發現它們因為作用不同引用的命名空間不一樣。以下是各個命名空間的含義。

system

包含用於定義常用值和引用資料型別、事件和事件處理程式、介面、屬性和處理異常的基礎類和基類。其他類提供支援下列操作的服務:資料型別轉換,方法引數操作,數學計算,遠端和本地程式呼叫,應用程式環境管理以及對託管和非託管應用程式的監管。 

system.data

包含組成大部分 ado.net 

結構的類。

ado.net 

結構使您可以生成可用於有效管理來自多個資料來源的資料的元件。在斷開連線的方案(如 

internet

)中,ado.net 

提供了一些可以在多層系統中請求、更新和協調資料的工具。

ado.net 

結構也可以在客戶端應用程式(如 

windows 

窗體)或 

asp.net 

建立的 

html 

頁中實現。

system.configuration

命名空間包含具有以下用途的型別:處理配置資料,如計算機或應用程式配置檔案中的資料。子命名空間包含具有以下用途的型別:配置程式集,編寫元件的自定義安裝程式,支援用於在客戶端和伺服器應用程式中新增或刪除功能的可插入模型。

system.collections

包含定義各種物件集合(如列表、佇列、位陣列、雜湊表和字典)的介面和類。

system.collections.generic

包含定義泛型集合的介面和類;泛型集合允許使用者建立強型別的集合,這種集合在型別安全和效能上均優於非泛型強型別集合。

converthelper返回的是泛型集合,所以我們要引用system.collections.generic,大大提高效率和安全效能

泛型集合在學習大話設計模式的時候接觸過,這次又重新學習了一遍。陣列我們都清楚,用來實現資料的連續儲存,其實我們在用vb6敲系統時就用陣列,但是陣列最大的缺點就是建立時須指定陣列變數的大小,在兩個元素之間新增元素也比較困難。到了vs平台,就引入了集合、泛型的概念。

集合簡言之,就是能克服上述缺點實現對資料的儲存。可根據元素的多少自動重新分配。後來在使用過程中,為了避免因呼叫資料時發生資料型別不同而導致資料庫的不安全,又引入了泛型。我們的converthelper類返回泛型集合,就是建立強型別的集合。

imports system.collections.generic     '新增反省集合的命名空間

imports system.reflection '新增反射的命名空間

public class converthelper

'將datatable轉化為泛型集合

public shared function converttolist(of t as new)(byval dt as datatable) as ilist(of t)

dim mylist as list(of t) = new list(of t)() '定義放回的集合

dim mytype as type = gettype(t) '得到實體類的型別名

dim tempname as string = string.empty '定義乙個臨時變數

dim dr as datarow '定義行集

'遍歷datatable的所有資料行

for each dr in dt.rows

dim myt as new t '建立乙個實體類的物件

dim arraypi as propertyinfo() = myt.gettype().getproperties() '定義屬性集合

dim pi as propertyinfo

'遍歷pi物件的所有屬性

for each pi in arraypi

tempname = pi.name '將屬性名稱複製給臨時變數

'檢查datatable是否包含此列(列名==物件的屬性名)

if (dt.columns.contains(tempname)) then '將此屬性與datatable裡的列名比較

'判斷此屬性是否有setter

if (pi.canwrite = false) then '判斷此屬性是否可寫,如果不可寫,跳出本次迴圈

continue for

end if

dim value as object = dr(tempname) '定義乙個物件型的變數來儲存列的值

'如果非空,則賦給物件的屬性

if (value.tostring() <> dbnull.value.tostring()) then

pi.setvalue(myt, value, nothing)

end if

end if

next

mylist.add(myt) '新增到集合

next

return mylist '返回實體集合

end function

end class

以前對物件導向的理解是封裝、繼承、多型,隨著一步步的學習,我們還會了解介面、集合、泛型、委託、客套等一系列概念。它們使程式更安全、靈活……

再次解讀ConvertHelper

資料庫臨時表的資料都是通過我們自己判斷轉換傳入實體中的。如圖 如上圖所示,所查詢出來的datatable的username欄位和 欄位的值是直接賦到實體e user的username和 屬性裡面的。賦值的過程,是通過我們自己判讀輸入的 user.username reader.getstring 2...

工廠與泛型

在採用三層架構進行開發的過程中,我們通常會用到工廠。在表示層中通過它來建立不同的業務例項,再 去呼叫方法。假設我們專案中存已下幾層 業務介面層,業務層 實現實務介面 業務工廠層,資料訪 問層,通用方法層,表示層等。如果業務很多,我們定義了很多的不同的介面,在不用泛型的業務工廠類 dal region...

泛型與反射

泛型 泛型的作用 泛型是jdk1.5以後才有的,可以在編譯時期進行型別檢查,且可以避免頻繁型別轉化!泛型的使用 泛型的方法 public class genericdemo 測試方法 test public void testmethod throws exception 泛型的類 public c...