任意のオブジェクトを任意のプロパティに基いてソート その2

前の記事で書いたコードでは各プロパティごとにソート方法が固定だったので、任意のプロパティだけソート方法を変更するための拡張機能を実装した。あまりテストしてないのでまたなおすかも。

ソースコード

Imports System.Reflection

Public Class CustomComparisonCreater(Of T)
    Inherits ComparisonCreater(Of T)

    Private _customComp As Dictionary(Of String, Comparison(Of T)) = New Dictionary(Of String, Comparison(Of T))

    Private NotCompareComparison As Comparison(Of T) = Function(x, y) 0 '比較をしないComparison

    Public Sub New()
    End Sub

    ''' <summary>
    ''' T型の指定したプロパティに基いて任意の比較を行うためのComparisonを登録
    ''' 
    ''' </summary>
    ''' <param name="propName"></param>
    ''' <param name="comp">昇順のComparison</param>
    ''' <remarks></remarks>
    Public Sub AddComp(ByVal propName As String, ByVal comp As Comparison(Of T))
        If propName Is Nothing OrElse comp Is Nothing Then Throw New ArgumentNullException

        Dim prop As PropertyInfo = GetProp(propName)
        If prop Is Nothing Then Throw New ArgumentException
        Dim key As String = prop.Name
        If Me._customComp.ContainsKey(key) Then
            Me._customComp(key) = comp
        Else
            Me._customComp.Add(key, comp)
        End If
    End Sub


    Public Sub AddNotCompare(ByVal propName As String)
        If propName Is Nothing Then Throw New ArgumentNullException

        Dim prop As PropertyInfo = GetProp(propName)
        If prop Is Nothing Then Throw New ArgumentException
        Dim key As String = prop.Name
        If Me._customComp.ContainsKey(key) Then
            Me._customComp(key) = Me.NotCompareComparison
        Else
            Me._customComp.Add(key, Me.NotCompareComparison)
        End If
    End Sub

    Public Overrides Function GetPropAscComparison(ByVal propName As String) As System.Comparison(Of T)
        If propName Is Nothing Then Throw New ArgumentNullException
        If Me._customComp.ContainsKey(propName) Then
            Return Me._customComp(propName)
        Else
            Return MyBase.GetPropAscComparison(propName)
        End If

    End Function

    Public Overrides Function GetPropDescComparison(ByVal propName As String) As System.Comparison(Of T)
        If propName Is Nothing Then Throw New ArgumentNullException
        If Me._customComp.ContainsKey(propName) Then
            Return ReverseComp(Me._customComp(propName))
        Else
            Return MyBase.GetPropDescComparison(propName)
        End If
    End Function


End Class