I would agree.  I want generic support.  These should help you get by
till then...

Public Function Load(Of T As New)( _
   ByVal queryName As String, _
   ByVal parameters As IDictionary(Of String, Object)) As T

        Dim mapper As SqlMapper = DatabaseManager.Instance()
        Dim rv As T

        rv = DirectCast(mapper.QueryForObject(queryName,
DirectCast(parameters, Object))

        Return rv

End Function

Public Function Enumerate(Of T As New)( _
   ByVal queryName As String, _
   ByVal parameters As IDictionary(Of String, Object)) As IEnumerable(Of T)

        Dim mapper As SqlMapper = DatabaseManager.Instance()

        Dim collector As TypedEnumerateCollector(Of T) = New
TypedEnumerateCollector(Of T)

        mapper.QueryWithRowDelegate(queryName, parameters, New
SqlMapper.RowDelegate(AddressOf collector.Collect))

        Return collector.Collected()

End Function

Private Class TypedEnumerateCollector(Of T)

        Private _list As IList(Of T)

        Public Sub New()
                _list = New List(Of T)
        End Sub

        Public Sub Collect(ByVal rowObject As Object, ByVal parameterObject
As Object, ByVal junkList As IList)
                _list.Add(DirectCast(rowObject, T))
        End Sub

        Public Function Collected() As IEnumerable(Of T)
                Return _list
        End Function

End Class

Public Function Map(Of Tk, Tv As New)( _
 ByVal queryName As String, _
 ByVal parameters As IDictionary(Of String, Object), _
 ByVal keySel As KeySelector(Of Tk, Tv)) As IDictionary(Of Tk, Tv)

        Dim mapper As SqlMapper = DatabaseManager.Instance()
        Dim collector As TypedMapCollector(Of Tk, Tv) = New
TypedMapCollector(Of Tk, Tv)(keySel)

        mapper.QueryWithRowDelegate(queryName, parameters, New
SqlMapper.RowDelegate(AddressOf collector.Collect))

        Return collector.Collected()

End Function

Public Delegate Function KeySelector(Of Tk, Tv)(ByVal v As Tv) As Tk

Private Class TypedMapCollector(Of Tk, Tv)

        Private _map As IDictionary(Of Tk, Tv)
        Private _keySelector As KeySelector(Of Tk, Tv)

        Public Sub New(ByVal keySel As KeySelector(Of Tk, Tv))
                _map = New Dictionary(Of Tk, Tv)
                _keySelector = keySel
        End Sub

        Public Sub Collect(ByVal rowObject As Object, ByVal parameterObject
As Object, ByVal junkList As IList)
                Dim v As Tv = DirectCast(rowObject, Tv)
                Dim k As Tk = _keySelector(v)
                _map.Add(k, v)
        End Sub

        Public Function Collected() As IDictionary(Of Tk, Tv)
                Return _map
        End Function

End Class

Reply via email to