Реализация Icomparable интерфейса для универсального класса - PullRequest
1 голос
/ 11 февраля 2012

Я не могу выяснить, как реализовать IComparable интерфейсный метод CompareTo для универсального класса.

У меня есть класс с именем BindingProperty<T>, который используется для создания List<BindingProperty<intOrString>> для привязки к DataGrid.Проблема в том, что я не могу выполнить операцию сортировки, поскольку интерфейс BindingProperty<T> не реализован этим классом *1009*.Результат сравнения будет зависеть от элемента данных «Значение» класса BindingProperty<T>, где «Значение» имеет тип Т. Когда я щелкаю заголовок столбца в DataGrid, я получаю исключение этот метод CompareTo() не реализован.

Мне нужна помощь для реализации этого интерфейса.Должен ли я использовать IComparable<T>?Если да, то как мне это сделать?

Заранее спасибо, Шакти

Ответы [ 3 ]

0 голосов
/ 11 февраля 2012

Вы можете использовать общее ограничение, чтобы требовать, чтобы T реализовывал IComparable<T>.Затем вы можете сравнить два экземпляра BindingProperty<T>, сравнив их Value членов.Мне не ясно, нужен ли ваш класс для реализации IComparable или IComparable<T>, но реализация обоих не является большой дополнительной работой.

class BindingProperty<T>
  : IComparable<BindingProperty<T>>, IComparable where T : IComparable<T> {

  public T Value { get; set; }

  public Int32 CompareTo(BindingProperty<T> other) {
    return Value.CompareTo(other.Value);
  }

  public Int32 CompareTo(Object other) {
    if (other == null)
      return 1;
    var otherBindingProperty = other as BindingProperty<T>;
    if (otherBindingProperty == null)
      throw new ArgumentException();
    return CompareTo(otherBindingProperty);
  }

}
0 голосов
/ 11 февраля 2012

Установите ограничение общего типа на T.

public class BindingProperty<T> : IComparable where T : IComparable
{
    public T Value {get; set;}

    public int CompareTo(object obj)
    {
       if (obj == null) return 1;

       var other = obj as BindingProperty<T>;
       if (other != null) 
            return Value.CompareTo(other.Value);
       else
            throw new ArgumentException("Object is not a BindingProperty<T>");
    }
}

Edit:
Альтернативное решение для обработки, если значение не реализует IComparable. Это поддержит все типы, просто не будет сортировать, если они не реализуют IComparable.

public class BindingProperty<T> : IComparable
    {
        public T Value {get; set;}

        public int CompareTo(object obj)
        {
           if (obj == null) return 1;

           var other = obj as BindingProperty<T>;
           if (other != null) 
           {
               var other2 = other as IComparable;
               if(other2 != null)
                  return other2.CompareTo(Value);
               else
                  return 1; //Does not implement IComparable, always return 1
           }
           else
                throw new ArgumentException("Object is not a BindingProperty<T>");
        }
    }
0 голосов
/ 11 февраля 2012

Если тип является пользовательским классом, то ваш пользовательский класс должен быть IComparable.

, например

List<FooClass>, затем FooClass необходимо унаследовать / реализовать IComparable.

...