2009-08-24 3 views
1

У меня есть группа классов, каждая из которых обладает свойством, называемым Sequence. Это свойство реализуется из интерфейса ISequenced. В этом примере можно вызвать один из этих классов A.
Когда у меня есть список (из A), я хочу иметь возможность сортировать их, используя стандартный List.Sort (адрес делегата), где делегат является стандартной функцией, которая принимает в двух объектах ISequenced и сравнивает их порядковые номера и возвращает логический флаг, а не объявляет функцию для каждого отдельного класса, который реализует ISequenced.Использование отражения для типизированных делегатов и интерфейсов

E.g.

Dim li as List(of A) = GetValues() 

li.Sort(addressof SortBySeq) 

... 

Public Function SortBySeq(ByVal ob1 as ISequenced, ByVal ob2 as ISequenced) as Boolean 
    return ob1.Sequence.CompareTo(ob2.Sequence) 
End If 

EDIT: Использование выше дает мне следующую ошибку:

"Overload resolution failed because no accessible 'Sort' can be called with these arguments: 'Public Sub Sort(comparison As System.Comparison(Of A))': Option Strict On does not allow narrowing in implicit type conversions between method 'Public Function SortBySeq(ob1 As ISequenced, ob2 As ISequenced) As Integer' and delegate 'Delegate Function Comparison(Of A)(x As A, y As A) As Integer'. 'Public Sub Sort(comparer As System.Collections.Generic.IComparer(Of A))': 'AddressOf' expression cannot be converted to 'System.Collections.Generic.IComparer(Of A)' because 'System.Collections.Generic.IComparer(Of A)' is not a delegate type."

Как бы объявить функцию для того, чтобы это сделать (если это вообще возможно в VB.NET

Спасибо, Dane.

ответ

0

Не нужно было реализовывать IComparer в конце, поскольку я только сравнивал десятичные числа. Оказывается, что .NET 3.5 добавил по крайней мере некоторые ковариационные способности с делегатами, поэтому я обновился до этого, и пример, который я дал выше, кажется, работает нормально.

1

Реализовать IComparer. Все, что вам нужно, это here.

Редактировать: О, я вижу, что такое руб. Все классы, у которых есть свойство Sequence, должны реализовать интерфейс, чтобы быть сопоставимым. Например. используйте IHaveSequence и выполните IComparer <IHaveSequence>. Определение IHaveSequence должно быть очевидным.

+0

IComparer позволит мне сравнить два объекта одного и того же класса, но я не хочу реализовывать функцию для каждого класса, который использует интерфейс ISequenced. Я расширил свой вопрос с помощью примера кода, который может дать вам лучшее представление о том, что я пытаюсь сделать. – link664

+0

Это красота интерфейсов. См. Править выше. – xanadont

+0

Я думаю, это действительно должно быть IHasSequence. – xanadont

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