ConvertHelper與泛型集合

            在機房重構時,我們經常會用到ConvertHelper。它把從數據庫中查詢到的dateTable(也是一個臨時表)轉化爲泛型,然後再填充到DataGridView控件中。ConvertHelper類有兩點體現了面向對象的思想。一是因爲它是經常被使用而被封裝起來的類;二是因爲它的返回值是泛型集合,泛型集合使存儲數據時靈活而安全,也體現了面向對象的思想。


ConvertHelper與sqlHelper

           
           一開始接觸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




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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章