2012-03-28 43 views
4

我想驗證此類:min >= max。我意識到使用泛型我不能使用比較器。如何使用泛型指定驗證此情況?

這是我的泛型類。

public class Range<T> 
{ 
    public T MinValue { get; set; } 
    public T MaxValue { get; set; } 

    public Range() { } 

    public Range(T min, T max) 
    { 
     this.MinValue = min; 
     this.MaxValue = max; 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj == null) return false; 

     var other = obj as Range<T>; 
     return this.MinValue.Equals(other.MinValue) && 
       this.MaxValue.Equals(other.MaxValue); 
    } 

    public override string ToString() 
    { 
     return string.Format("{0},{1}", this.MinValue, this.MaxValue); 
    } 
} 

牛逼的數據類型只能是數字,是有辦法接受只是數字並接受<=

回答

11

不,你不能限制泛型的數字,但可以約束TIComparable<T>然後用CompareTo()

public class Range<T> where T : IComparable<T> 
{ 
    .... 
} 

然後你就可以說:

if (min.CompareTo(max) >= 0)... 

,並拋出驗證異常或者任何你想要的驗證。您可以使用相同的方法來確保值> = min並且< = max。

if (value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0)... 
+0

結構約束不會給訪問>,<等,另外一些事情落實'IComparable '但不是'struct',比如'string'。 – 2012-03-28 20:58:43

+0

我知道,我只是說添加它不會獲得任何東西,因爲您將失去使用'string'的能力,例如,可能需要從「A」到「Z」的範圍。 .. – 2012-03-28 21:01:06

1
public class Range<T> where T : IComparable<T> 
{ 
    ... 

    public bool Check(T value) 
    { 
     return value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0; 
    } 
} 

如果範圍在0和10之間,想0,10失敗(排除最低和最高) - 簡單地取代 「> =」 與 「>」 和 「< =」 與「< 」。

我還建議按照equals改變覆蓋來自:

return this.MinValue.Equals(other.MinValue) && 
     this.MaxValue.Equals(other.MaxValue); 

這樣:

return this.MinValue.CompareTo(other.MinValue) == 0 && 
     this.MaxValue.CompareTo(other.MaxValue) == 0; 
+0

驗證max> min或max> = min是相同的邏輯。 – SimpleVar 2012-03-28 21:00:59

相關問題