【问题标题】:Can I use generics to populate List(of t) with custom classes?我可以使用泛型用自定义类填充 List(of t) 吗?
【发布时间】:2009-07-10 14:01:21
【问题描述】:

我有几个不同的列表要调用。它们都具有相同的类格式: id、值、描述、顺序。我不想创建一堆类来返回所有列表,而是想使用泛型并告诉它要返回什么样的列表。但是,我不知道如何填充这些类。

以下是我的调用代码中的 2 个函数示例。这应该表明列表的类型和用于获取数据的存储过程:

Public Function getTheEyeColors()
    Dim glEyeColors As New GenericList
    Return glEyeColors.GetALList(Of EyeColor)("GetAllEyeColors")
End Function

Public Function getTheHairColors()
    Dim glHairColors As New GenericList
    glHairColors.GetALList(Of HairColor)("GetAllHairColors")
End Function

这是我试图用来构建通用列表的代码...

Public Function GetALList(Of t)(ByVal storedproc As String) As List(Of t)

    Dim lstGenericList As New List(Of t)
    Dim oGenericListItem As t
    Dim oProviderFactory As New ProviderFactory
    Dim oConnection As DbConnection
    Dim oReader As System.Data.IDataReader
    Dim oFactory As DbProviderFactory
    Dim oFileMgt As New FileMgt
    Dim oCmd As DbCommand

    oFactory = oProviderFactory.GetFactory
    oConnection = oProviderFactory.GetProviderConnection(oFactory)
    oCmd = oConnection.CreateCommand
    oCmd.CommandType = CommandType.StoredProcedure

    oCmd.CommandText = storedproc

    Using (oConnection)

        oConnection.Open()
        oReader = oCmd.ExecuteReader()

        While oReader.Read
            HERE IS WHERE I AM NOT SURE HOW TO POPULATE THE EYECOLOR OR HAIRCOLOR CLASS
            lstGenericList.Add(oGenericListItem)
        End While

        oConnection.Close()

    End Using

    Return lstGenericList

End Function

【问题讨论】:

    标签: vb.net generics class


    【解决方案1】:

    您可以添加两个通用约束;我不知道如何在 VB 中表达它们,但这里是 C# 版本:

    • T : new() - 必须有一个无参数的构造函数
    • T : ICommonInterface - T 必须实现一个接口

    然后您将常用属性(ID、Value、Description、Order)放入界面中,您将能够创建new T(),设置属性并将其添加到列表中。

    编辑:

    指定它必须是可创建的和实现接口的 VB 语法是:

    • (Of T As {ICommonInterface, New})

    【讨论】:

    • +1 击败了我。有问题的 VB 语法是(Of T As ICommonInterface),仅供参考
    • 那么无参数构造函数呢?随意编辑答案以包含 VB 语法:)
    【解决方案2】:

    Jon 建议的方法可能是更好的方法,但我看到的另一种方法是 DotNetNuke 架构中的 FillObject 方法。基本上,它是一种基于约定的方法,它使用反射将对象的属性与数据集的值匹配。

    我个人不喜欢这种方法,但这确实意味着您不必为每个存储过程创建新的代码实现来水合对象。

    代码可在 DNN 项目的完整源代码下载中获得。

    【讨论】:

      【解决方案3】:
      While oReader.Read
        HERE IS WHERE I AM NOT SURE HOW TO POPULATE THE EYECOLOR OR HAIRCOLOR CLASS
      

      查看 LinqToSql (System.Data.Linq)。您可能正在重新发明它。

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 2011-08-13
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        相关资源
        最近更新 更多