2012-03-28 8 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); 
    } 
} 

T 데이터 타입은 숫자 만 할 수 있습니다, 단지 숫자에 동의하고 <=을 수용하는 방법은 무엇입니까?

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

을 그리고 검증 예외를 던져 :

답변

11

아니, 당신은 숫자 제네릭를 제한 할 수는 없지만 IComparable<T>T를 제한 할 수 다음 CompareTo()

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

를 사용 그럼 당신은 말할 수 또는 어떤 유효성 확인을 원하십니까? 동일한 값을 사용하여 값이> = min이고 < = max인지 확인할 수 있습니다.

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

구조체 제약 등에 대한 액세스 권한을>, <,주지 못할 것이다

또한에서 우선 같음에 변화하는 것이 좋습니다 'IComparable '하지만'string'과 같은'struct '는 아닙니다. –

+0

알다시피, 나는 단지 '문자열'과 함께 사용하는 능력을 잃을 것이므로 아무 것도 얻지 못할 것이라고 덧붙였다. 예를 들어 "A"에서 "Z"까지 범위 을 갖는 것이 바람직 할 수있다. .. –

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 실패 (최소 및 최대 제외)하려는 경우 - <을 "과"> "와"< = "와"> = "단순히 교체 ".

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

관련 문제