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

Vb.net 以编程方式选择要实例化的类,vb.net,class,instantiation,Vb.net,Class,Instantiation,我目前正在使用Visual Studio 2010.Net 4.0处理VB.Net,我需要您的帮助来创建一个集合类让我们使用接受两个参数的构造函数将其称为“cl_MyCollection”: SqlDataReader对象 指向我创建的自定义类的一些方法 情况是:;我有五个SQL 2000数据库表和五个VB.Net自定义类。 每个自定义类都包含该类表示的表的每个字段的变量。 例如:tbl_User有2个字段User_ID和User_Name,tbl_Family有3个字段Family_ID、Fa

我目前正在使用Visual Studio 2010.Net 4.0处理VB.Net,我需要您的帮助来创建一个集合类让我们使用接受两个参数的构造函数将其称为“cl_MyCollection”:

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

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") 理想情况下,我希望以下代码能够正常工作,或者至少是它所代表的理念:

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 这可能吗?还是我需要坚持选择案例

对不起,这篇文章太长了。 编辑:修复了打字错误,select案例现在指向第二个参数“selectedClass”,这与最初的预期一致。

使用ORM,如NHibernate

对象关系映射器完全按照您所描述的那样工作;它们将数据库表映射到代码类,反之亦然。ORM将允许您选择实例化哪个类


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

如果你想让事情变得更简单,远离XML和ORM,你可以使用泛型

上面的链接介绍了泛型,但只介绍了C语言中的示例

要在VB.NET中使用泛型,它使用的是type1,而不是type2


否则,请遵循米奇·麦特的建议。一旦你知道如何使用ORM,它就非常简单。

谢谢你的回复,我已经了解了一些ORM技术和集合。通用库,但我很难理解如何实现它们以适应我现有的代码。我可以问一下,你们期望我的代码在有新想法的情况下会是什么样子吗?从那时起,我应该能够调整它以适应我的项目的其余部分。再次感谢您的帮助。 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