|
' ___________________________________________________
'
' � Hi-Integrity Systems 2007. All rights reserved.
' www.hisystems.com.au - Toby Wicks
' ___________________________________________________
'
Option Strict On
Option Explicit On
''' --------------------------------------------------------------------------------
''' <summary>
''' This class is identical to DatabaseObject except that rather than using the
''' LoadFields and SaveFields the properties are automatically set and retrieved
''' using the FieldMappingAttribute attribute. If necessary, the LoadFields and
''' SaveFields functions can still be overridden and the MyBase.LoadFields and
''' MyBase.SaveFields functions explicity called to load the database fields
''' that have been marked with the FieldMappingAttribute attribute.
''' </summary>
''' --------------------------------------------------------------------------------
Public MustInherit Class DatabaseObjectUsingAttributes
Inherits DatabaseObject
''' --------------------------------------------------------------------------------
''' <summary>
''' Initializes a new DatabaseObject with the parent collection that this object is
''' associated with.
''' </summary>
''' --------------------------------------------------------------------------------
Protected Sub New(ByVal objParentCollection As DatabaseObjects)
MyBase.New(objParentCollection)
End Sub
Private Const pcePropertyFieldScope As Reflection.BindingFlags = _
Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.NonPublic
''' --------------------------------------------------------------------------------
''' <summary>
''' Sets the properties and fields marked with the FieldMappingAttribute with the
''' values from the database record. Properties or fields that are an enum data
''' type are automatically converted from the database integer value to the equivalent
''' enum. For properties and fields marked with the FieldMappingObjectHookAttribute
''' the property's or field's object is also traversed for properties or fields marked
''' with the FieldMappingAttribute.
''' </summary>
''' <example>
''' <code>
'''
''' <DatabaseObjects.FieldMapping("Name")> _
''' Private pstrName As String
'''
''' OR
'''
''' <DatabaseObjects.FieldMapping("Name")> _
''' Public Property Name() As String
''' Get
'''
''' Return pstrName
'''
''' End Get
'''
''' Set(ByVal Value As String)
'''
''' pstrName = Value
'''
''' End Set
'''
''' End Property
''' </code>
''' </example>
''' --------------------------------------------------------------------------------
Protected Overrides Sub LoadFields(ByVal objFields As SQL.SQLFieldValues)
LoadFieldsForObject(Me, objFields)
LoadFieldsForHookedObjects(objFields)
End Sub
Private Sub LoadFieldsForHookedObjects(ByVal objFields As SQL.SQLFieldValues)
Dim objAttributes As Object()
Dim objObject As Object
'Search for fields that have the FieldMappingObjectHookAttribute
For Each objField As Reflection.FieldInfo In Me.GetType.GetFields(pcePropertyFieldScope)
objAttributes = objField.GetCustomAttributes(GetType(FieldMappingObjectHookAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMappingObjectHook As FieldMappingObjectHookAttribute In objAttributes
If objField.FieldType.IsValueType Then
Throw New DatabaseObjectsException("Field " & objField.Name & " marked with FieldMappingObjectHook attribute on value type - must be a class type")
Else
objObject = objField.GetValue(Me)
If objObject Is Nothing Then Throw New DatabaseObjectsException("Field " & objField.Name & " marked with " & GetType(FieldMappingObjectHookAttribute).Name & " is Nothing")
LoadFieldsForObject(objObject, objFields)
End If
Next
End If
Next
'Search for properties that have the FieldMappingObjectHookAttribute
For Each objProperty As Reflection.PropertyInfo In Me.GetType.GetProperties(pcePropertyFieldScope)
objAttributes = objProperty.GetCustomAttributes(GetType(FieldMappingObjectHookAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMappingObjectHook As FieldMappingObjectHookAttribute In objAttributes
If objProperty.CanRead Then
If objProperty.PropertyType.IsValueType Then
Throw New DatabaseObjectsException("Property " & objProperty.Name & " marked with FieldMappingObjectHook attribute on value type - must be a class type")
Else
objObject = objProperty.GetValue(Me, Nothing)
If objObject Is Nothing Then Throw New DatabaseObjectsException("Property " & objProperty.Name & " marked with " & GetType(FieldMappingObjectHookAttribute).Name & " is Nothing")
LoadFieldsForObject(objObject, objFields)
End If
End If
Next
End If
Next
End Sub
Private Sub LoadFieldsForObject(ByVal objObject As Object, ByVal objFields As SQL.SQLFieldValues)
Dim objAttributes As Object()
'Search for fields that have the FieldMappingAttribute
For Each objField As Reflection.FieldInfo In objObject.GetType.GetFields(pcePropertyFieldScope)
objAttributes = objField.GetCustomAttributes(GetType(FieldMappingAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMapping As FieldMappingAttribute In objAttributes
If Not objFields(objFieldMapping.FieldName).Value Is DBNull.Value Then
'If an enum field then convert the integer to the enum equivalent
If objField.FieldType.IsEnum Then
objField.SetValue(objObject, _
System.Enum.ToObject(objField.FieldType, _
objFields(objFieldMapping.FieldName).Value))
Else
objField.SetValue(objObject, objFields(objFieldMapping.FieldName).Value)
End If
End If
Next
End If
Next
'Search for properties that have the FieldMappingAttribute
For Each objProperty As Reflection.PropertyInfo In objObject.GetType.GetProperties(pcePropertyFieldScope)
objAttributes = objProperty.GetCustomAttributes(GetType(FieldMappingAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMapping As FieldMappingAttribute In objAttributes
If objProperty.CanWrite Then
If Not objFields(objFieldMapping.FieldName).Value Is DBNull.Value Then
'If an enum field then convert the integer to the enum equivalent
If objProperty.PropertyType.IsEnum Then
objProperty.SetValue(objObject, _
System.Enum.ToObject(objProperty.PropertyType, _
objFields(objFieldMapping.FieldName).Value), _
Nothing)
Else
objProperty.SetValue(objObject, objFields(objFieldMapping.FieldName).Value, Nothing)
End If
End If
End If
Next
End If
Next
End Sub
''' --------------------------------------------------------------------------------
''' <summary>
''' Gets the values from the properties and fields marked with the FieldMappingAttribute
''' to be saved to the database. Properties or fields that return an enum data type are
''' automatically converted from the enum to the equivalent integer value for database
''' storage. For properties and fields marked with the FieldMappingObjectHookAttribute
''' the property's or field's object is also traversed for properties or fields marked
''' with the FieldMappingAttribute.
''' </summary>
''' <example>
''' <code>
'''
''' <DatabaseObjects.FieldMapping("Name")> _
''' Private pstrName As String
'''
''' OR
'''
''' <DatabaseObjects.FieldMapping("Name")> _
''' Public Property Name() As String
''' Get
'''
''' Return pstrName
'''
''' End Get
'''
''' Set(ByVal Value As String)
'''
''' pstrName = Value
'''
''' End Set
'''
''' End Property
''' </code>
''' </example>
''' --------------------------------------------------------------------------------
Protected Overrides Function SaveFields() As SQL.SQLFieldValues
Dim objFieldValues As SQL.SQLFieldValues
'get the field mapping values for the current object
objFieldValues = SaveFieldsForObject(Me)
'get the field mapping values for hooked properties or fields
objFieldValues.Add(SaveFieldsForHookedObjects)
Return objFieldValues
End Function
Private Function SaveFieldsForHookedObjects() As SQL.SQLFieldValues
Dim objAttributes As Object()
Dim objObject As Object
Dim objFieldValues As New SQL.SQLFieldValues
'Search for fields that have the FieldMappingObjectHookAttribute
For Each objField As Reflection.FieldInfo In Me.GetType.GetFields(pcePropertyFieldScope)
objAttributes = objField.GetCustomAttributes(GetType(FieldMappingObjectHookAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMappingObjectHook As FieldMappingObjectHookAttribute In objAttributes
If objField.FieldType.IsValueType Then
Throw New DatabaseObjectsException("Field " & objField.Name & " marked with FieldMappingObjectHook attribute on value type - must be a class type")
Else
objObject = objField.GetValue(Me)
If objObject Is Nothing Then Throw New DatabaseObjectsException("Field " & objField.Name & " marked with " & GetType(FieldMappingObjectHookAttribute).Name & " is Nothing")
objFieldValues.Add(SaveFieldsForObject(objObject))
End If
Next
End If
Next
'Search for properties that have the FieldMappingObjectHookAttribute
For Each objProperty As Reflection.PropertyInfo In Me.GetType.GetProperties(pcePropertyFieldScope)
objAttributes = objProperty.GetCustomAttributes(GetType(FieldMappingObjectHookAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMappingObjectHook As FieldMappingObjectHookAttribute In objAttributes
If objProperty.CanRead Then
If objProperty.PropertyType.IsValueType Then
Throw New DatabaseObjectsException("Property " & objProperty.Name & " marked with FieldMappingObjectHook attribute on value type - must be a class type")
Else
objObject = objProperty.GetValue(Me, Nothing)
If objObject Is Nothing Then Throw New DatabaseObjectsException("Property " & objProperty.Name & " marked with " & GetType(FieldMappingObjectHookAttribute).Name & " is Nothing")
objFieldValues.Add(SaveFieldsForObject(objObject))
End If
End If
Next
End If
Next
Return objFieldValues
End Function
Private Function SaveFieldsForObject(ByVal objObject As Object) As SQL.SQLFieldValues
Dim objAttributes As Object()
Dim objFieldValues As New SQL.SQLFieldValues
'Search for fields that have the FieldMappingAttribute
For Each objField As Reflection.FieldInfo In objObject.GetType.GetFields(pcePropertyFieldScope)
objAttributes = objField.GetCustomAttributes(GetType(FieldMappingAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMapping As FieldMappingAttribute In objAttributes
'If an enum field then convert the enum to an integer
If objField.FieldType.IsEnum Then
objFieldValues.Add(objFieldMapping.FieldName, CInt(objField.GetValue(objObject)))
Else
objFieldValues.Add(objFieldMapping.FieldName, objField.GetValue(objObject))
End If
Next
End If
Next
'Search for properties that have the FieldMappingAttribute
For Each objProperty As Reflection.PropertyInfo In objObject.GetType.GetProperties(pcePropertyFieldScope)
objAttributes = objProperty.GetCustomAttributes(GetType(FieldMappingAttribute), True)
If Not objAttributes Is Nothing Then
For Each objFieldMapping As FieldMappingAttribute In objAttributes
If objProperty.CanRead Then
'If an enum field then convert the enum to an integer
If objProperty.PropertyType.IsEnum Then
objFieldValues.Add(objFieldMapping.FieldName, CInt(objProperty.GetValue(objObject, Nothing)))
Else
objFieldValues.Add(objFieldMapping.FieldName, objProperty.GetValue(objObject, Nothing))
End If
End If
Next
End If
Next
Return objFieldValues
End Function
End Class
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.