#Region "directives"
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Collections
Imports System.Text
Imports System.Reflection
#End Region
Namespace GenericSortComponent
''' <summary>
''' This class is used to compare any
''' type(property) of a class for sorting.
''' This class automatically fetches the
''' type of the property and compares.
''' </summary>
Public NotInheritable Class GenericComparer(Of T)
Implements IComparer(Of T)
Public Enum SortOrder
Ascending
Descending
End Enum
#Region "member variables"
Private sortColumn_Renamed As String
Private sortingOrder_Renamed As SortOrder
#End Region
#Region "constructor"
Public Sub New(ByVal sortColumn_Renamed As String, ByVal sortingOrder_Renamed As SortOrder)
Me.sortColumn_Renamed = sortColumn_Renamed
Me.sortingOrder_Renamed = sortingOrder_Renamed
End Sub
#End Region
#Region "public property"
''' <summary>
''' Column Name(public property of the class) to be sorted.
''' </summary>
Public ReadOnly Property SortColumn() As String
Get
Return sortColumn_Renamed
End Get
End Property
''' <summary>
''' Sorting order.
''' </summary>
Public ReadOnly Property SortingOrder() As SortOrder
Get
Return sortingOrder_Renamed
End Get
End Property
#End Region
#Region "public methods"
''' <summary>
''' Compare interface implementation
''' </summary>
''' <param name="x">First Object</param>
''' <param name="y">Second Object</param>
''' <returns>Result of comparison</returns>
Public Function Compare(ByVal x As T, ByVal y As T) As Integer Implements IComparer(Of T).Compare
Dim propertyInfo As PropertyInfo = GetType(T).GetProperty(sortColumn_Renamed)
Dim obj1 As IComparable = CType(propertyInfo.GetValue(x, Nothing), IComparable)
Dim obj2 As IComparable = CType(propertyInfo.GetValue(y, Nothing), IComparable)
If sortingOrder_Renamed = SortOrder.Ascending Then
Return (obj1.CompareTo(obj2))
Else
Return (obj2.CompareTo(obj1))
End If
End Function
#End Region
End Class
End Namespace