2012-06-17 4 views
1

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

Это то, что я получил:

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 as Stellung» и «y as Stellung» написаны синим цветом, что означает, что это тип, а не фактический объект.

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

ответ

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 
+0

Спасибо за очень быстрый ответ! Никакие поля моего класса не являются частными, все открыто и все они расположены в одном файле, одном пространстве имен, одной сборке. С этой стороны не должно быть проблем с доступом. Добавление IComparable было ключом! – Ralf

Смежные вопросы