2009-07-02 2 views
0

У меня есть вспомогательная функция, которая в основном вызывает CompareTo на два объектах, но делают некоторый специальный угловой случай проверку, преобразования и т.д.Как смешивать/исправить IComparable и IComparable <T> беспорядок

Первоначально я написал функцию как таковые :

public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode) 
{ 
    ... 
    retCode = lhs.CompareTo(rhs); 
    ... 
} 

Но проблема в том, что если у меня есть class AwesomeClass : IComparable<AwesomeClass>. На самом деле у меня есть несколько, поскольку некоторые более старые классы IComparable прошли IComparable<T>. Однако компилятор злится, потому что он не может преобразовать эти новые объекты в IComparable. Я не знаю, делает ли это хуже, но некоторые из них - abstract (хотя абстрактный класс действительно обеспечивает реализацию).

Как я могу передать «Я хочу два объекта, которые я могу назвать CompareTo on», а не компилятор, чтобы дать мне любую губу. Предпочтительно, новая функция НЕ должна выглядеть как BetterCompare<AwesomeClass>(this, that, out retCode);, но просто «поступайте правильно». Или есть лучший способ сделать это, не касаясь каждого класса, делающего их иIComparable и IComparable<T>?

+0

Вы можете перегружать методы, но вам нужно лучшее решение, чем это. –

ответ

9

Вы можете либо сделать AwesomeClass реализовать необщей IComparable интерфейс, а также IComparable<T>, или вы можете написать общий BetterCompare метод: (. Обратите внимание, что это может жить вместе с вашим существующим способом)

public static bool BetterCompare<T>(T lhs, T rhs, out retCode) 
    where T : IComparable<T> 
{ 
    ... 
    retCode = lhs.CompareTo(rhs); 
    ... 
} 

+0

Спасибо. Я пробовал использовать Generics для решения проблемы, но я не помню, чтобы квалифицировался (?) T. – MighMoS

+0

Поздравляю с 75 K – rahul

+0

Нет * действительно * там еще - 74951 в данный момент :) –

0

Вы всегда можете изменить переменные на тип объекта, а затем использовать отражение, чтобы увидеть, реализуют ли они один из интерфейсов, а затем передают их в правильный интерфейс.

ПРИМЕЧАНИЕ. Отражение безумно медленное, поэтому используйте его с осторожностью.

0

Вы можете посмотреть Comparer<T>, который реализует как IComparer<T>, так и IComparer и использует его в соответствующих местах. Это может потребовать некоторого рефакторинга вашего кода.

0

The documentation говорит:

объект, возвращаемый свойством по умолчанию использует общий интерфейс System.Collections.Generic.IComparable<T> для сравнения двух объектов. Если тип T не реализует общий интерфейс IComparable<T>, свойство Default возвращает Comparer<T>, который использует интерфейс System.Collections.IComparable.

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

  • Нет связанных вопросов^_^