Реализация универсального IComparer в VB

Я пытаюсь создать класс, реализующий общий IComparer моего собственного класса «Stellungen» (который переводится в позиции, например, на шахматной или шашечной доске).

Вот что я получил:

Private Class comparer(Of Stellung)
    Implements System.Collections.Generic.IComparer(Of Stellung)

    Public Function Compare(x As Stellung, y As Stellung) As Integer Implements System.Collections.Generic.IComparer(Of Stellung).Compare

    End Function

End Class

Проблема в том, что внутри функции у меня нет доступа ни к каким полям моего класса. Если я начну с x. Intellisense даст мне только .Equals, .GetHashCode — методы, которые вы получаете для типа, но не для экземпляра. Visual Studio 10 также подчеркивает это: в определении функции биты «x как Stellung» и «y как Stellung» написаны голубым цветом, что означает, что это тип, а не фактический объект.

Так... что мне делать?? Как мне получить доступ к вещам, которые я хочу сравнить внутри своего класса?? Спасибо!


person Ralf    schedule 17.06.2012    source источник


Ответы (2)


Поля, вероятно, являются частными, и поэтому вы не можете получить к ним доступ. Заставьте ваши классы реализовать интерфейс IComparable<T>. Затем вы можете использовать это в своем классе компаратора.
Вот пример универсального класса компаратора, который сравнивает объекты, реализующие IComparable<T>.

Public Class GenericComparer(Of T As IComparable(Of T))
    Inherits Comparer(Of T)

    Public Overrides Function [Compare](ByVal x As T, ByVal y As T) As Integer
        If (Not x Is Nothing) Then
            If (Not y Is Nothing) Then
                Return x.CompareTo(y)
            End If
            Return 1
        End If
        If (Not y Is Nothing) Then
            Return -1
        End If
        Return 0
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Dim comparer As GenericComparer(Of T) = TryCast(obj,GenericComparer(Of T))
        Return (Not comparer Is Nothing)
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return MyBase.GetType.Name.GetHashCode
    End Function

End Class


public class Stellung
   Implements IComparable(Of Stellung)

   Public Function CompareTo(ByVal value As Stellung) As Integer
       'Here you should be able to access all fields. 
   End Function
End class
person Magnus    schedule 17.06.2012
comment
Спасибо за очень быстрый ответ! В моем классе нет приватных полей, все общедоступно и все находится в одном файле, одном пространстве имен, одной сборке. Проблем с доступом с этой стороны быть не должно. Ключевым моментом было добавление IComparable‹T›! - person Ralf; 17.06.2012

Если вы объявите Private Class comparer(Of Stellung), тогда "Stellung" будет просто заполнителем для используемого типа (например, "T" в учебниках).

Объявите Private Class comparer, а Implements System.Collections.Generic.IComparer(Of Stellung) сообщает компилятору, что вы хотите сравнить объекты типа "Stellung", что, кстати, делает свойства Stellung видимыми в редакторе.

person Michael    schedule 20.09.2018