Как создать свойство универсального типа класса? - PullRequest
1 голос
/ 27 мая 2010

У меня есть этот код:

public class SelectionList<T> : ObservableCollection<SelectionItem<T>> where T : IComparable<T>
{
  // Code 
}

public class SelectionItem<T> : INotifyPropertyChanged
{
// Code
}

Мне нужно создать свойство типа SelectionList следующим образом:

public SelectionList<string> Sports { get; set; }

Но когда я заменяю строку на DataRowView, как

 public SelectionList<DataRowView> Sports { get; set; }`

Я получаю ошибку. Почему это не работает?

Ответы [ 2 ]

5 голосов
/ 27 мая 2010

Ваша проблема в том, что string реализует IComparable<string>, а DataRowView - нет.

SelectionList<T> имеет ограничение, что T должен реализовывать IComparable<T>, следовательно, ошибка.

public class SelectionList<T> : ObservableCollection<SelectionItem<T>> where T : IComparable<T>
{
  // Code 
}

Одним из решений было бы создание подкласса DataRowView и реализация IComparable:

public class MyDataRowView : DataRowView, IComparable<DataRowView>{
  int CompareTo(DataRowView other) {
    //quick and dirty comparison, assume that GetHashCode is properly implemented
    return this.GetHashCode() - (other ? other.GetHashCode() : 0);
  }
}

Тогда SelectionList<MyDataRowView> должен скомпилироваться нормально.

4 голосов
/ 27 мая 2010

У вас есть ограничение на ваш класс where T : IComparable<T>. DataRowView не реализует IComparable<DataRowView> и поэтому не может использоваться в этом случае.

Дополнительную информацию об общих ограничениях см. Здесь: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

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