以编程方式选择要实例化的类

时间:2010-07-07 14:34:14

标签: vb.net class instantiation

我目前正在使用Visual Studio 2010(.Net 4.0)使用VB.Net,我需要你的帮助来创建一个集合类(我们称之为'cl_MyCollection'),其构造函数接受两个参数:

  1. SqlDataReader对象
  2. 指向我创建的自定义类的一些方法
  3. 情景是;我在SQL 2000中有五个数据库表和五个VB.Net自定义类。 每个自定义类都包含该类表示的表的每个字段的变量。 例如:“tbl_User”有2个字段“User_ID”和“User_Name”,tbl_Family“有3个字段”Family_ID“,”Family_Name“和”Family_Location“。
    这是我创建的VB.Net自定义类,用于读取和存储“tbl_User”表的单个记录:

    Imports System.Data.SqlClient
    
    Public Class cl_table_User
        Property User_ID As Integer
        Property User_Name As String
    
        Public Sub New(ByRef rdr As SqlDataReader)
            Me.User_ID = rdr("User_ID)
            Me.User_Name = rdr("User_Name")
        End Sub
    End Class
    

    我为其他数据库表创建了类似的类。

    这个想法是执行一个SQL语句并使用结果来实例化我想要的集合类('cl_MyCollection')。 我在想这样的事情:('conn'是'SqlConnection'对象)

    Dim cmd As SqlCommand = New SqlCommand("Select * From tbl_Users", conn)
    Dim rdr As SqlDataReader = cmd.ExecuteReader()
    Dim aCollection as new cl_MyCollection(rdr, "tbl_Users")
    

    以后我想使用“tbl_Family”:

    Dim cmd As SqlCommand = New SqlCommand("Select * From tbl_Family", conn)
    Dim rdr As SqlDataReader = cmd.ExecuteReader()
    Dim aCollection as new cl_MyCollection(rdr, "tbl_Family")
    

    正如您所看到的,第三行是传递两个参数,SQLDataReader以及指向我创建的自定义类的一些方法。然后,该类的构造函数将遍历结果并创建我创建的自定义类的对象。

    我希望第二个参数(以某种方式)决定使用哪个自定义类。 “某种程度上”是我在这里寻求帮助的原因。

    我能想到的唯一方法就是设置一个select case并列出每个自定义类,然后创建一个自定义类的对象,但我希望有更好的方法。目前我的设置如下:

    Public Class cl_MyCollection
        Private records As New Collection
    
        Public Sub New(rdr As SqlDataReader, selectedClass as string)
    
             Select Case selectedClass
                Case "tbl_User"
    
                    While (rdr.Read())
                        Dim thisRecord as new cl_table_User(rdr)
                        records.Add(thisRecord)
                    End While
    
                Case "tbl_Family"
    
                    While (rdr.Read())
                        dim thisRecord as new cl_table_Family(rdr)
                        records.Add(thisRecord)
                    End While             
    
             End Select
    
        End Sub
    End Class
    

    理想情况下,我希望以下代码可以使用,或至少代表它的想法:

    Public Class cl_MyCollection
        Private records As New Collection
    
        Public Sub New(rdr As SqlDataReader, selectedClass as TYPE)
    
            While (rdr.Read())
                Dim thisRecord as new selectedClass(rdr)
                records.Add(thisRecord)
            End While
    
        End Sub
    End Class
    

    这可能吗?或者我是否需要坚持选择案例?

    P.S对不起这篇文章的篇幅。 编辑:修正了拼写错误,选择案例现在指向第二个参数('selectedClass'),如最初的预期。

2 个答案:

答案 0 :(得分:1)

如果你想让事情“更简单”并远离XML和ORM,你可以使用泛型。

http://msdn.microsoft.com/en-us/library/512aeb7t.aspx

上面的链接讲述了泛型,但只是C#中的例子。

要在VB.NET中使用泛型,它使用(Of type1,type2)而不是< type1,type2>

否则请遵循Mitch Wheat的建议。一旦你知道如何使用它,ORM就非常简单。

答案 1 :(得分:0)

使用Object-Relational Mapper(ORM),例如NHibernate。

对象关系映射器完全按照您的描述执行;他们将数据库表映射到代码类,反之亦然。 ORM将允许您选择要实例化的类。

如果您只需要冻结对象并解冻它们的方法,则可以通过serializing将对象的XML表示形式存储在数据库的文本字段中。如果您知道类型,则允许您将任何类型的对象存储在单个表中。但是你失去了查询对象的能力。