如何在vb.net中创建强类型列表类



我不愿意承认这一点,但我是VB.NET中面向对象编程的新手。我有一个名为Subscriber.VB的类对象,它可以正常工作,但我想创建这些对象的"集合"或列表。有人能帮我利用下面的代码创建一个订阅者列表吗?这样"消费者"就可以循环浏览这个订阅者列表了?以下是我目前所拥有的:

Public Class Subscriber
Public Sub New(ByVal theSubscriberID As Int32)
    Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
    Dim connection As New SqlConnection(sConnDatabase)
    Dim cmd As SqlCommand
Try
    cmd = New SqlCommand("GetSubscriberInfo_v", connection)
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.AddWithValue("@SubscriberID", theSubscriberID)
    connection.Open()
    Dim objReader As SqlDataReader = cmd.ExecuteReader()
    Do While objReader.Read()
        SetObjectData(objReader)
    Loop
    objReader.Close()
    connection.Close()
Catch ex As Exception
    Throw
End Try
End Sub
Private Sub SetObjectData(ByVal theObjReader As SqlDataReader)
    Try
        Me._ID = Convert.ToInt32(theObjReader("SubscriberID"))
        Me._NameForLogon = theObjReader("SubscriberName").ToString()
        Me._NameInFull = theObjReader("SubscriberNameFull").ToString()
        Me._DaysUntilExpired = Convert.ToInt32(theObjReader("DaysUntilExpired"))
        Me._SignupDate = theObjReader("SignupDate")
        Me._ExpirationDate = theObjReader("ExpirationDate")
        Me._SubscriberPhone = theObjReader("SubscriberPhone").ToString()
        Me._MostRecentRenewal = theObjReader("MostRecentRenewal")
        Me._CumulativeRevenue = Convert.ToDecimal(theObjReader("CumulativeRevenue"))
        Me._NumberOfRenewals = theObjReader("NumberOfRenewals")
        Me._SubscriptionStatusCode = theObjReader("SubscriptionStatusCode")
        Me._SubscriptionStatus = theObjReader("SubscriptionStatus").ToString()
        Me._NotificationStatusCode = theObjReader("NotificationStatusCode")
        Me._NotificationStatus = theObjReader("NotificationStatus")
    Catch ex As Exception
        Throw
    End Try
End Sub
End Class

我没有展示那些先发球员和先发球员。不幸的是,这必须仅限于Visual Studio 2008。由于几个原因,我们无法升级此环境。

这里的最佳做法是什么?将公共类SubscriberList添加到Subscriber.vb文件中,还是应该是一个单独的文件?更重要的是,我被困在如何接受我所拥有的东西上——创建一个合适的列表。然后,调用者将创建SubscriberList对象的一个实例。请帮我开始。谢谢

编辑:这是我得益于你的想法(我正在考虑添加一些重载构造函数,这些构造函数可能会以各种方式过滤数据……这是一个好的做法吗?):

    Public Class SubscriberList
Public Sub New()
    Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
    Dim connection As New SqlConnection(sConnDatabase)
    Dim cmd As SqlCommand
    Dim oSubscriberList As New List(Of Subscriber)
    cmd = New SqlCommand("GetSubscriberInfo_v", connection)
    cmd.CommandType = CommandType.StoredProcedure
    connection.Open()
    Dim objReader As SqlDataReader = cmd.ExecuteReader()
    Do While objReader.Read()
        Dim id As Integer = objReader("SubscriberID")
        Dim s As Subscriber = New Subscriber(id)
        oSubscriberList.Add(s)
    Loop
    objReader.Close()
    connection.Close()
End Sub
End Class

尝试使用时出现新错误:

Dim allSubscribers As New SubscriberList
For Each Subscriber In allSubscribers
                       ' allSubscribers is not declared
Next

为什么不申报?困惑的新手错误我确信。。。

编辑(编号2):将名称从SubscriberList更改为Subscribers复数&实现了这一点(见下文),但我对从构造函数中删除数据库连接和查询并将其放置在单独的类中的建议感到非常困惑。我正在设想将重载构造函数添加到订阅服务器(和订阅服务器)。我无法想象每个构造函数将如何获得各自的数据。

    Public Class Subscribers
    Implements IEnumerable(Of Subscriber)
#Region "properties"
    Public List As New List(Of Subscriber)
#End Region
Public Function GetEnumerator() As IEnumerator(Of Subscriber) _
                    Implements IEnumerable(Of Subscriber).GetEnumerator
    Return List.GetEnumerator()
End Function
Private Function GetEnumerator1() As IEnumerator _
                    Implements IEnumerable.GetEnumerator
    Return List.GetEnumerator()
End Function
Public Sub New()
    Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
    Dim connection As New SqlConnection(sConnDatabase)
    Dim cmd As SqlCommand
    cmd = New SqlCommand("SELECT * FROM dbo.Subscriber_v", connection)
    cmd.CommandType = CommandType.Text
    connection.Open()
    Dim objReader As SqlDataReader = cmd.ExecuteReader()
        Do While objReader.Read()
        Dim id As Integer = objReader("SubscriberID")
        Dim s As Subscriber = New Subscriber(id)
        List.Add(s)
    Loop
    objReader.Close()
    connection.Close()
End Sub
End Class

在VB中,您可以创建自定义对象的列表。

dim oSubscriberList as new List(of Subscriber)

然后您可以实例化新的订阅者并将其添加到列表中

oSubscriberList.add('add object here')

这可能是处理它的最简单、最快速、最肮脏的方法。您还可以创建一个单独的类来创建对象的集合。如果你想遵循SOLID编程原则并使用测试驱动的开发,"最佳"实践会让你倾向于制作一个单独的集合类来处理它,但这不是必要的。

编辑:根据下方的评论

您不需要创建subscriberlist类。只需创建一个订阅服务器的常规列表并将其添加到列表中即可。在您想要创建此列表的地方执行此操作(表单加载、一些事件等)

Dim oSubscriberList as NEW List(of Subscriber)
Dim sConnDatabase As String = ConfigurationManager.ConnectionStrings("DatabaseConnString").ConnectionString
Dim connection As New SqlConnection(sConnDatabase)
Dim cmd As SqlCommand
cmd = New SqlCommand("SELECT * FROM dbo.Subscriber_v", connection)
cmd.CommandType = CommandType.Text
connection.Open()
Dim objReader As SqlDataReader = cmd.ExecuteReader()
while objReader.Read()
    oSubscriberList.Add(New Subscriber(objReader("SubscriberID"))
end while
'additional cleanup steps here

然后你可以迭代你的列表如下:

For each sub as Subscriber in oSubscriberList
    'do something
Next

最新更新