2012-03-28 10 views
4

Ich versuche, diese Klasse zu validieren: min >= max. Ich erkannte, dass ich mit Generika die Komparatoren nicht verwenden kann.Wie kann man diese Situation mit Generics validieren?

Dies ist meine generische Klasse.

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

T-Datentyp nur Zahlen sein kann, ist es eine Möglichkeit, nur Zahlen zu akzeptieren und die <= zu akzeptieren?

Antwort

11

Nein, können Sie nicht Generika Zahlen beschränken, aber Sie können T zu IComparable<T> beschränken und dann CompareTo()

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

verwenden Dann können Sie sagen:

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

Und eine Validierung Ausnahme auslösen oder welche Validierung Sie möchten. Sie können dasselbe verwenden, um sicherzustellen, dass der Wert> = min und < = max.

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

struct Einschränkung würde nicht geben Zugriff auf>, <, etc. Zusätzlich einige Dinge umsetzen 'IComparable ' aber sind nicht 'struct' wie' string'. –

+0

Ich weiß, ich würde nur hinzufügen, es würde nichts gewinnen, da Sie die Fähigkeit verlieren würden, es mit 'string' zu verwenden, es könnte wünschenswert sein, einen Bereich von" A "bis" Z "zum Beispiel zu haben. .. –

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

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

Wenn Sie zwischen 0 und 10 liegen und wollen 0, 10 zum Scheitern verurteilt (auszuschließen min und max) - einfach ersetzen "> =" mit ">" und "< =" mit "< ".

Ich würde auch in den Equals Wechsel empfehlen von außer Kraft setzen:

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

dazu:

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

Bestätigen, dass max> min oder max> = min die gleiche Logik ist. – SimpleVar

Verwandte Themen