Программно выберите класс для создания экземпляра

В настоящее время я играю с VB.Net, используя Visual Studio 2010 (.Net 4.0), и мне нужна ваша помощь для создания класса коллекции (назовем его 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()
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 и некоторые средства указания на созданный мной настраиваемый класс. Затем конструктор этого класса будет перебирать результаты и создавать объект созданного мной настраиваемого класса.

Я хочу, чтобы второй аргумент (каким-то образом) заставил его решить, какой пользовательский класс использовать. «Каким-то образом» - вот почему я прошу вашей помощи.

Единственный способ, которым я могу подумать, это сработает, - это настроить случай выбора и перечислить каждый настраиваемый класс, а затем создать объект настраиваемого класса, но я надеюсь, что есть лучший способ. В настоящее время у меня это настроено так:

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'), как и предполагалось изначально.


person user328414    schedule 07.07.2010    source источник
comment
Спасибо за ответы, я ознакомился с несколькими методами ORM и библиотекой Collections.Generic, но у меня возникли проблемы с пониманием того, как реализовать любой из них, чтобы он соответствовал моему существующему коду. Могу я спросить, как вы, ребята, ожидаете, что мой код будет выглядеть с новыми идеями? Оттуда я смогу адаптировать его для остальной части моего проекта. Еще раз спасибо за любую помощь.   -  person user328414    schedule 07.07.2010


Ответы (2)


Если вы хотите сделать вещи «проще» и держитесь подальше от XML и ORM, вы можете использовать дженерики.

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

Ссылка выше рассказывает о дженериках, но только о примерах на C #.

Чтобы использовать универсальный шаблон в VB.NET, он использует (Of type1, type2) вместо ‹type1, type2›

В противном случае следуйте совету Митча Уита. ORM очень прост, если вы знаете, как его использовать.

person Brett Allen    schedule 07.07.2010

Используйте объектно-реляционный сопоставитель (ORM), например NHibernate.

Объектно-реляционные преобразователи делают именно то, что вы описываете; они сопоставляют таблицы базы данных с классами кода, и наоборот. ORM позволит вам выбрать, какой класс создать.

Если вам просто нужен способ заморозить и разморозить объекты, вы можете сохранить XML-представление вашего объекта в текстовом поле базы данных с помощью сериализуем его. Если вы знаете тип, это позволяет вам хранить любой объект в одной таблице. Но вы теряете возможность запрашивать свои объекты.

person Robert Harvey    schedule 07.07.2010