任意のオブジェクトを任意のプロパティに基いてソート その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