我正在尝试在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 :(得分:3)
您的代码不起作用,因为GenericParamMap
的不同实例不共享公共基础(Object
除外)。也就是说,就{4}而言,Thing(Of Integer)
与Thing(Of String)
完全无关。
解决此问题的一种方法是让您的类实现接口(或扩展基类),然后将列表声明为List(Of ThatInterface)
。请注意,你将丢失通用类型信息,但基本上没有办法解决这个问题 - 你根本不能使用整数和字符串(除了它们的公共基类之外,这是Object
),因此您也无法对Thing(Of Integer)
和Thing(Of String)
进行处理。
答案 1 :(得分: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
但是你不能同时将你的方法用于不同的类型,例如string,Integer ......