为泛型类实现Icomparable接口

时间:2012-02-11 12:40:06

标签: .net generics compareto icomparable

我无法找到如何为泛型类实现IComparable接口方法CompareTo

我有一个名为BindingProperty<T>的类,用于创建List<BindingProperty<intOrString>>以绑定到DataGrid。问题是我无法执行排序操作,因为IComparable类没有实现BindingProperty<T>接口。比较的结果将取决于BindingProperty<T>类的数据成员'Value',其中'Value'是T类。当我点击DataGrid的列标题时,我得到一个异常< / em>未实现CompareTo()方法。

我需要帮助来实现此接口。我应该使用IComparable<T>吗?如果是,我该怎么办?

提前致谢 沙克蒂

3 个答案:

答案 0 :(得分:0)

如果Type是自定义类,那么您的自定义类需要是IComparable。

e.g。

List<FooClass>,然后FooClass需要继承/实施IComparable

答案 1 :(得分:0)

您可以使用通用约束来要求T实现IComparable<T>。然后,您可以通过比较他们的BindingProperty<T>成员来比较两个Value实例。我不清楚您是否需要您的班级来实施IComparableIComparable<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);
  }

}

答案 2 :(得分:0)

在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>");
    }
}

修改
如果值未实现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>");
        }
    }