1

ジェネリック クラスのIComparableインターフェイス メソッドを実装する方法がわかりません。CompareTo

にバインドするBindingProperty<T>を作成するために使用されるというクラスがあります。問題は、このクラスによってインターフェイスが実装されていないため、Sort 操作を実行できないことです。比較の結果は、'Value' が T 型であるクラスのデータ メンバー 'Value' に依存します。DataGrid の列ヘッダーをクリックすると、メソッドが実装されていないという例外が発生します。List<BindingProperty<intOrString>>DataGridIComparableBindingProperty<T>BindingProperty<T>CompareTo()

このインターフェースを実装するには助けが必要です。を使用する必要がありIComparable<T>ますか? はいの場合、どうすればよいですか?

よろしくお願いします

4

3 に答える 3

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>");
        }
    }
于 2012-02-11T12:46:15.663 に答える
0

Type がカスタム クラスの場合、カスタム クラスは IComparable である必要があります。

例えば

List<FooClass>、次にFooClass継承/実装する必要がありますIComparable

于 2012-02-11T12:44:00.597 に答える
0

汎用制約を使用して、そのTimplementsを要求できますIComparable<T>。次に、メンバーを比較することにより、2 つの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);
  }

}
于 2012-02-11T12:45:59.440 に答える