Использование отражения для типизированного делегата и интерфейсов - PullRequest
1 голос
/ 24 августа 2009

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

например.

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

РЕДАКТИРОВАТЬ: Использование выше дает мне следующую ошибку:

"Не удалось разрешить перегрузку, потому что нет Доступный «Сортировать» можно вызвать с эти аргументы: «Public Sub Sort (сравнение как System.Comparison (Of A))»: опция Строгое включение не допускает сужения в неявные преобразования типов между Метод 'Открытая функция SortBySeq (ob1 As2quenced, ob2 As ISequenced) Как Целое число и делегат Сравнение функций (Of A) (x As A, y As А) Как целое число. Public Sub Sort (сравнивать как System.Collections.Generic.IComparer (Of A)) ':' AddressOf 'выражение не может быть конвертировано в «System.Collections.Generic.IComparer (Из А) «потому что «System.Collections.Generic.IComparer (Из А) 'не является типом делегата. "

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

Спасибо, Дейн.

Ответы [ 2 ]

1 голос
/ 24 августа 2009

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

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

0 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...