【问题标题】:Creating a generic list of a generic type创建泛型类型的泛型列表
【发布时间】:2011-06-30 16:45:17
【问题描述】:

我正在尝试在 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”,因为它没有定义,但我不确定如何或在哪里定义它。我认为有一个通用的方法定义是可以的。有没有人有任何想法? 谢谢

【问题讨论】:

  • 作为一个侧节点:我不确定GenericParamMap 是否是正确的名称。 map 通常将键映射到值,因此您的 List(Of ...) 可以称为 map,而不是单个条目。你所说的GenericParamMap 只是一个元组,所以你可以称它为GenericTupleGenericParamMapEntry

标签: .net vb.net generics


【解决方案1】:

您的代码不起作用,因为 GenericParamMap 的不同实例不共享一个共同的基础(Object 除外)。也就是说,就 VB 而言,Thing(Of Integer)Thing(Of String) 完全无关。

解决此问题的一种方法是让您的类实现一个接口(或扩展一个基类),然后将您的列表声明为List(Of ThatInterface)。请注意,这样会丢失泛型类型信息,但基本上没有办法解决这个问题——你根本不能使用整数和字符串(除非它们的公共基类是这样的,即Object),因此你也不能把Thing(Of Integer)Thing(Of String)一视同仁。

【讨论】:

    【解决方案2】:

    我认为你必须使用如下通用方法:

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

    但你不能同时将你的方法用于不同的类型,例如字符串、整数...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多