2012-03-08 18 views
1

私はジェネリックの基本的な使い方を探っています。私はこの単純なパターンを実装して、日々の使用において典型的な問題を解決できると思っていました。私は単純な例を探すために何日も過ごしました。私は.Equalsを探すための例を見つけることができますが、それほど過去はありません。その後のことができるようにC#で簡単な汎用比較を実装する方法

Spec<double> voltageSpec; 
Spec<int> cyclesSpec; 
Spec<myClass> fishInTheOceanSpec; 

:私はのようなものでインスタンス化することができるようにしたい

bool isGood = voltageSpec.inSpec(5.0); 
bool isGood cyclesSpec.inSpec(2); 
bool isGood fishInTheOceanSpec.(new myClass(20)); 

私の試みは以下の通りです。

/// <summary> 
/// Generic object to hold a specification i.e min and max limits. 
/// Implements a method to determin if a value is between limits. 
/// </summary> 
public class Spec<T> : IComparer<T> 
{ 
    public Spec() 
    { 
     Min = default(T); 
     Max = default(T); 
    } 
    public T Min { get; set; } 
    public T Max { get; set; } 
    public bool inSpec(T Value) 
    { 
     if ((Comparer<T>.Default.Compare(Value, this.Max) <= 0) & 
      (Comparer<T>.Default.Compare(Value, this.Min) >= 0)) 
      return true; 
     else 
      return false; 
    } 

    public int Compare(T x, T y) 
    { 
     if (x == y) return 0; 
     if (x < y) return -1; 
     if (x > y) return 1; 
    } 

    public Spec<T> Copy() 
    { 
     return (Spec<T>)this.MemberwiseClone(); 
    } 
} 
+0

は、その一部を比較しますクラス。 –

+0

@EK、クラス名に完全な単語を使用することを検討してください。具体的には、代わりに特定のプロパティの範囲を代わりに含める必要があります。 –

答えて

2

次のように私はリファクタリングう - T比較を提供するために責任を負うことにする - これは、プリミティブ型のため、すでに機能し、カスタムクラスは、ちょうどIComparable<T>を実装する必要があります:あなたは、おそらくに&&をメンター

public class Spec<T> where T : IComparable<T> 
{ 
    public Spec() 
    { 
     Min = default(T); 
     Max = default(T); 
    } 
    public T Min { get; set; } 
    public T Max { get; set; } 
    public bool inSpec(T Value) 
    { 
     if(Value.CompareTo(this.Max) <=0 && 
      Value.CompareTo(this.Min) >=0) 
      return true; 
     else 
      return false; 
    } 

    public Spec<T> Copy() 
    { 
     return (Spec<T>)this.MemberwiseClone(); 
    } 
} 
1

は、その後、あなたがIComparable<T>を実装するのですintdoubleまたはstringようCompareToT

public int Compare(T x, T y) 
{ 
    return x.CompareTo(y); 
} 

基本の型を適用することができ、この

public class Spec<T> : IComparer<T> 
    where T : IComparable<T> 
{ 
    .... 
} 

のようなあなたのクラスを宣言します。

関連する問題