我只是按照您的建议工作(VB)。此代码有效(从西班牙语翻译,因此它可能包含拼写错误):例如,它可以这样使用:
Public Sub Main()
'the SELEC method used below this line is written once and called from every table/class'
Dim CustList As List(Of CUSTOMER) = CUSTOMER.SELEC("Name = 'Peter'", "Name DESC")
Dim myOrders As List(Of ORDER) = CustList(0).Orders
CustList(0).Name = "John"
End Sub
Public Interface ITables 'used solely to unify all the table types'
' ReadOnly Property PrimaryKey() As String is better to shadow it from SuperClass TableType'
End Interface
Public Class TableType(Of T As ITables)'this T is what you are looking for'
Public PrimaryKey As String
Public Shared Function SELEC(Optional ByVal sWhere As String = "", Optional ByVal sOrderBy As String = "") As List(Of T)
'shared/static method to fill and return a typed List with the DB rows'
'can be called using for example Type.SELEC()'
Dim oConn As New OdbcConnection(My.Settings.ConnectionString)
Dim oComm As OdbcCommand = oConn.CreateCommand
oComm.CommandText = "SELECT * FROM " & GetType(T).Name
If sWhere.Length > 0 Then oComm.CommandText &= " WHERE " & sWhere
If sOrderBy.Length > 0 Then oComm.CommandText &= " ORDER BY " & sOrderBy
Dim oListRet As New List(Of T)
oConn.Open()
Dim oDR As OdbcDataReader = oComm.ExecuteReader
Dim oneRow As T
Do While oDR.Read
oneRow = Activator.CreateInstance(GetType(T))
For i = 0 To oDR.FieldCount - 1
Dim value = oDR.Item(i)
If TypeOf value Is DBNull Then value = Activator.CreateInstance(oDR.GetFieldType(i)) ' default value'
oneRow.GetType.GetProperty(oDR.GetName(i)).SetValue(oneRow, value, Nothing)
Next
oListRet.Add(oneRow)
Loop
oDR.Close()
oConn.Close()
oConn.Dispose()
Return oListRet
End Function
Public Function UPDATE(Optional ByVal sWhere As String = "") As Integer
'not shared but one for all tables'
'working on this, almost finished'
End Function
Shared Function fnPropAttribute(ByVal oProp As PropertyInfo, ByVal sAttrName As String) As String
'working on this. Returns for example the value of the attribute 'Category' of a field'
Dim attributes As AttributeCollection = TypeDescriptor.GetProperties(oProp.DeclaringType)(oProp.Name).Attributes
Dim myAttribute As CategoryAttribute = CType(attributes(GetType(need to know wth to put here)), CategoryAttribute)
Return myAttribute.Category
End Function
End Class 'TableType'
Public Class Tables
Public Class CUSTOMER
Inherits TableType(Of CUSTOMER)
Implements ITables
Public Shadows Const PrimaryKey As String = "idCust"
'this returns the List(Of Orders) with my idCust'
Public ReadOnly Property ORDERs() As List(Of ORDER)
Get
Return ORDER.SELEC("idCust = " & Me.idCust)
End Get
End Property
Dim _idCust As Integer
'this Attributes will be used in UPDATE, INSERT, etc'
'Category 'Columns' is to distingish between DB fields and other possible properties'
'Description is the ODBCType of the field'
<Category("Columns"), Description("CHAR")> _
Public Property idCust() As Integer
Get
Return _idCust
End Get
Set(ByVal value As Integer)
_idCust = value
End Set
End Property
Dim _Name As String
<Category("Columns"), Description("CHAR")> _
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
'etc...'
End Class 'Customer'
Public Class ORDER
Inherits TableType(Of ORDER)
Implements ITables
Public Shadows Const PrimaryKey As String = "idOrder"
Dim _idOrder As Integer
<Category("Columns"), Description("CHAR")> _
Public Property idOrder() As Integer
Get
Return _idOrder
End Get
Set(ByVal value As Integer)
_idOrder = value
End Set
End Property
Dim _idCust As Integer
<Category("Columns"), Description("CHAR")> _
Public Property idCust() As Integer
Get
Return _idCust
End Get
Set(ByVal value As Integer)
_idCust = value
End Set
End Property
Dim _Artic As String
<Category("Columns"), Description("CHAR")> _
Public Property Artic() As String
Get
Return _Artic
End Get
Set(ByVal value As String)
_Artic = value
End Set
End Property
'etc...'
End Class 'Order'
End Class 'Tables'