Last time we went over Overloading function in .NET. Today we’ll take a look at generics. I had been wondering how to do this for some time, seeing that I could do it with Microsoft’s built in code. I have to say, it is pretty nice and really makes coding much easier and cleaner.
So take a look at this code where I parse data from Excel and put it into a class. I put it into any class I want to.
'Loop through items and send to action, e.g., put into a class, using function.
<Extension()>
Public Function Parse(Of TSource)(ByRef oArray(,) As Object, ByVal conversion As Func(Of Object(), TSource), ByVal iRowStart As Integer _
, ByVal iRowEnd As Integer, ByVal iColStart As Integer _
, ByVal iColEnd As Integer) As TSource()
Try
Dim tArray(iRowEnd - iRowStart) As TSource
Dim o1Array(iColEnd - iColStart) As Object
For i As Integer = iRowStart To iRowEnd
For j As Integer = iColStart To iColEnd
o1Array(j - iColStart) = oArray(i, j)
Next
tArray(i) = conversion(o1Array)
Next
Return tArray
Catch ex As System.IndexOutOfRangeException
Throw New System.IndexOutOfRangeException
End Try
End Function</pre>
And here’s how I would call it. Here I get the date range in the time card and put that information in my class that organizes the time card date information. The enumeration CSettings.BUTimeCardHeadings tells me where the heading is located in Excel so I don’t have to remember the actual column. When I grab the data, Excel-DNA puts it in zero-based two dimensional array, hence the minus 1.
Dim oaDates = moaJobs.FindAllSorted(mdteDate.ToOADate(), CSettings.BUTimeCardHeadings.tcDate - 1)
AddCItems(oaDates _
.Parse(Of CItem)(Function(o) _
New CItem( _
CastOrDefault(Of Double)(o(CSettings.BUTimeCardHeadings.tcHours - 1), 0.0#) _
, CastOrDefault(Of Double)(o(CSettings.BUTimeCardHeadings.tcClockIn - 1), 0.0#) _
, If(Not IsNothing(o(CSettings.BUTimeCardHeadings.tcJob - 1)) Or TypeOf o(CSettings.BUTimeCardHeadings.tcJob - 1) Is ExcelError _
, o(CSettings.BUTimeCardHeadings.tcJob - 1).ToString, vbNullString))))</pre>