2012-05-22 3 views
0

IComparable 형식의 두 값을 비교하고 같지 않은 경우 throw하는 함수를 작성하고 있습니다. 기본적으로, assert를 재 작성합니다. 예, 저는 바퀴를 다시 발명하고 있음을 알고 있습니다.IComparable IgnoreCase

public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T> 
    { 
     if (0 != Value1.CompareTo(Value2)) 
     { 
      throw new ApplicationException("Fail"); 
     } 
    } 

문자열을 제외하고는 잘 작동합니다. 대소 문자를 무시하는 옵션이 필요했습니다. "AA"vs "aa"

T가 문자열 인 경우이 메서드를 특히 재정의하려면 String.Compare를 사용하고 대/소문자를 무시할 수 있습니다. 또한 사용자가 문자열을 무시해야하는지 지정할 수 있도록 다른 매개 변수를 사용하는 것도 좋습니다 (int와 같은 다른 유형에서는 쓸모가 없으므로 혼란 스럽거나 나쁜 디자인처럼 보입니다. 여기서는 제안을 공개합니다).

이렇게하는 좋은 방법이 있습니까? 나는 또한 IComparable과 다른 유형으로 변경하는 것에 대해 개방적이다. 처음에는이 인터페이스가 작업을위한 최상의 인터페이스라고 생각했지만 지금은 내가 틀릴 수도 있다는 것을 깨달았다.

where T : IComparable<T> 
+1

작동하지 않을까요? 뭔가 (if (typeof (T) == string) String.Compare (...) –

+0

예, 이것은 내가 찾고있는 것입니다. 타입 비교가 어떻게 이루어 졌는지 알지 못했습니다. 감사! – Sperry

답변

1

당신은 시도 할 수 있습니다 : 당신은 단순히 T의 유형을 테스트하여 문자열 사건을 처리하기 위해

public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T> 
    { 
     if (typeof(T) == typeof(String)) 
     { 
      if (String.Compare(Value1.ToString(), Value2.ToString(), true) != 0) 
      { 
       throw new ApplicationException("Fail"); 
      } 
     } 
     else if (0 != Value1.CompareTo(Value2)) 
     { 
      throw new ApplicationException("Fail"); 
     } 
    } 
+0

이것은 잘 작동했습니다. 일반 유형을 얻는 것이 가능하다는 것을 몰랐습니다. 감사! – Sperry

+0

여러분을 환영합니다! 리플렉션을 사용하여 더 자세히 알아 보려면 [this] (http://msdn.microsoft.com/en-us/library/ms173183(v=80) .aspx)를 확인하십시오. – Luis

2

특별히 문자열을위한 다른 함수를 만들 수 있습니다. 당신이 문자열 과부하가 호출됩니다 IsEqual("A", "a")를 호출하는 경우

public static void IsEqual(string value1, string value2) 
{ 
    if (string.Compare(value1, value2, true) != 0) 
    throw new ApplicationException("Fail for strings"); 
} 

그럼 당신은 IsEqual(1, 1)이 당신의 일반적인 과부하가 호출됩니다 부르지 만한다면. 원하는 경우 문자열 오버로드에 대한 또 다른 선택적 매개 변수를 간단히 추가 할 수 있습니다.

관련 문제