我可以使用泛型来填充自定义类的List(of t)吗?

时间:2009-07-10 14:01:21

标签: vb.net generics class

我想要调用几个不同的列表。它们都具有相同的格式: 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

3 个答案:

答案 0 :(得分:8)

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

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

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

编辑:

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

  • (Of T As {ICommonInterface, New})

答案 1 :(得分:0)

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

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

该代码可在DNN项目的完整源代码下载。

答案 2 :(得分:0)

While oReader.Read
  HERE IS WHERE I AM NOT SURE HOW TO POPULATE THE EYECOLOR OR HAIRCOLOR CLASS

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