2012-03-08 91 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

你可能彪&&在比较的一部分类。 – 2012-03-08 20:31:17

+0

@EK,考虑使用完整的单词作为类名称,即名称范围类Range而不是Spec(这可能应该包括作为成员的特定属性的范围)。 – 2012-03-08 21:21:31

回答

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

声明你的类像这样

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

那么你可以申请CompareToT

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

基本类型,如intdoublestring国家执行IComparable<T>