2011-06-30 33 views
2

我想在vb.net 2.0框架中創建一個通用類型的列表。 這是泛型類型定義:創建一個通用類型的通用列表

---------- 
    Public Class GenericParamMap(Of T) 

    Public Sub New(ByVal pParamName As String, ByVal pPropValue As T) 
     mParamName = pParamName 
     mPropValue = pPropValue 
    End Sub 

    Public Property ParamName() As String 
     Get 
     Return mParamName 
     End Get 
     Set(ByVal Value As String) 
     mParamName = Value 
     End Set 
    End Property 
    Private mParamName As String 

    Public Property PropValue() As T 
     Get 
     Return mPropValue 
     End Get 
     Set(ByVal Value As T) 
     mPropValue = Value 
     End Set 
    End Property 
    Private mPropValue As T 
    End Class 
---------- 

這裏是將使用GenericParamMap列表的方法傳過來的參數:

Public Sub PopulateParamMap(ByVal pMap As List(Of GenericParamMap(Of T)) 
     pMap.Add(New GenericParamMap(Of Integer)("@region_id", RegionId)) 
     pMap.Add(New GenericParamMap(Of String)("@bus_addr1", BusAddress1)) 
     pMap.add(New GenericParamMap(Of Boolean)("@active_flag", ActiveFlag)) 
End Sub 
---------- 

編譯器不允許「T」的該方法的參數,因爲它沒有定義,但我不知道如何或在哪裏定義它。我認爲可以有一個通用的方法定義。有沒有人有任何想法? 感謝

+0

作爲一個邊節點:我不確定'GenericParamMap'是否是正確的名稱。 * map *通常將鍵映射到值,因此您的'List(Of ...)'可以被稱爲* map *,而不是單個條目。你描述爲'GenericParamMap'只是一個*元組*,所以你可以稱之爲'GenericTuple'或'GenericParamMapEntry'。 – Heinzi

回答

1

我認爲你必須使用泛型方法象下面這樣:

Public Sub PopulateParamMap(Of T)(ByVal pMap As List(Of GenericParamMap(Of T)) 
    pMap.Add(New GenericParamMap(Of T)("@region_id", RegionId)) 
End Sub 

,但你不能在同一時間使用你的方法對不同類型,如字符串,整數...

3

您的代碼不起作用,因爲GenericParamMap的不同實例不共享公共基礎(Object除外)。就VB而言,Thing(Of Integer)Thing(Of String)完全無關。

解決此問題的一種方法是讓您的類實現接口(或擴展基類),然後聲明您的列表爲List(Of ThatInterface)。請注意,您將丟失了這種通用類型的信息,但是根本沒有辦法解決這個問題 - 你根本就不能使用整數和字符串(除非它們的公共基類去掉,這就是Object),因此你也不能對待Thing(Of Integer)Thing(Of String)