【问题标题】:Programmatically choose the class to be instantiate以编程方式选择要实例化的类
【发布时间】:2011-03-12 20:45:23
【问题描述】:

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

  1. SqlDataReader 对象
  2. 一些指向我创建的自定义类的方法

场景是;我在 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() 将 aCollection 调暗为新的 cl_MyCollection(rdr, "tbl_Users")

以后当我想使用“tbl_Family”时:

Dim cmd As SqlCommand = New SqlCommand("Select * From tbl_Family", conn) Dim rdr As SqlDataReader = cmd.ExecuteReader() 将 aCollection 调暗为新的 cl_MyCollection(rdr, "tbl_Family")

如您所见,第三行传递了两个参数,SQLDataReader 和一些指向我创建的自定义类的方法。然后这个类的构造函数将遍历结果并创建一个我创建的自定义类的对象。

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

我认为这可行的唯一方法是设置一个选择案例并列出每个自定义类,然后创建自定义类的一个对象,但我希望有更好的方法。目前我的设置是这样的:

公共类 cl_MyCollection 私人记录作为新收藏 Public Sub New(rdr As SqlDataReader, selectedClass as string) 选择案例 selectedClass 案例“tbl_User” 而(rdr.Read()) 将 thisRecord 调暗为新的 cl_table_User(rdr) 记录。添加(此记录) 结束时 案例“tbl_Family” 而(rdr.Read()) 将 thisRecord 调暗为新的 cl_table_Family(rdr) 记录。添加(此记录) 结束时 结束选择 结束子 结束类

理想情况下,我希望以下代码能够工作,或者至少是它所代表的想法:

公共类 cl_MyCollection 私人记录作为新收藏 Public Sub New(rdr As SqlDataReader, selectedClass as TYPE) 而(rdr.Read()) 将 thisRecord 调暗为新的 selectedClass(rdr) 记录。添加(此记录) 结束时 结束子 结束类

这可能吗?还是我需要坚持选择案例?

P.S 抱歉这篇文章太长了。 编辑:修正了错字,选择案例现在按原意指向第二个参数('selectedClass')。

【问题讨论】:

  • 感谢您的回复,我查看了一些 ORM 技术和 Collections.Generic 库,但我无法理解如何实现它们以适应我现有的代码。我能问一下你们希望我的代码如何看待新想法吗?从那里我应该能够对其进行调整以适应我的项目的其余部分。再次感谢您的帮助。

标签: vb.net class instantiation


【解决方案1】:

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

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

以上链接介绍了泛型,但仅介绍了 C# 中的示例。

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

否则按照米奇小麦的建议。一旦你知道如何使用 ORM,它就非常简单。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2011-02-26
      • 2020-12-29
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多