如何创建泛型类的属性?

时间:2010-05-27 04:33:23

标签: c# generics properties

我有这段代码:

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 个答案:

答案 0 :(得分:5)

您的问题是string实施IComparable<string>DataRowView没有。{/ p>

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>应该编译好。

答案 1 :(得分:4)

您的班级where T : IComparable<T>受到限制。 DataRowView不实现IComparable<DataRowView>,因此在这种情况下不能使用。

有关通用约束的更多信息,请参见此处:http://msdn.microsoft.com/en-us/library/d5x73970.aspx