2010-06-11 2 views
7

나는 boolTryParse 방법을 "예"와 "아니오"로 바꾸고 싶습니다. 내가 (아래) 사용하고자하는 방법을 알고 있지만 bool의 메서드를 재정의하는 방법을 모르겠습니다.TryParse를 재정의하려면 어떻게해야합니까?

... bool TryParse(string value, out bool result) 
{ 
    if (value == "yes") 
    { 
     result = true; 
     return true; 
    } 
    else if (value == "no") 
    { 
     result = false; 
     return true; 
    } 
    else 
    { 
     return bool.TryParse(value, result); 
    } 
} 

답변

10

정적 메서드를 재정의 할 수 없습니다. 그러나 확장 방법을 만들 수 있습니다.

public static bool TryParse(this string value, out bool result) 
{ 
    // For a case-insensitive compare, I recommend using 
    // "yes".Equals(value, StringComparison.OrdinalIgnoreCase); 
    if (value == "yes") 
    { 
     result = true; 
     return true; 
    } 
    if (value == "no") 
    { 
     result = false; 
     return true; 
    } 

    return bool.TryParse(value, out result); 
} 

는 정적 클래스에 넣고 및 통화 코드를 다음과 같이 :

string a = "yes"; 
bool isTrue; 
bool canParse = a.TryParse(out isTrue); 
+2

개인적으로 Parse 메서드가'Nullable <>'을 반환하는 것을 좋아합니다. 문자열이 파싱되지 않으면 반환 값은 null입니다. 이렇게하면 out 매개 변수가 필요 없으며 멋진 호출 구문을 만들 수 있습니다. 예 : 'bool a = "blah".ParseBool() ?? false;' – Greg

+0

'Nullables'은 실제로 구문 분석에 편리하지만, 기존의 TryParse 메소드를 오버라이드하려고했습니다. 이제는 내 자신을 쓰고있어, 그럴거야. 또한,'StringComparison.OrdinalIgnoreCase'를 사용하고 있지만이 예제를 더 깔끔하게 보이게하지 않았습니다. 마지막으로, 출력 타입이 'bool'일 때 왜 메소드 'TryParseBoolean'에 라벨을 붙이겠습니까? ('Nullables'로 바꾸었다면 그 이름이 필요할 것입니다.) – dlras2

+0

@ cyclotis04 - 잘 부탁드립니다. out 매개 변수 때문에'TryParse'라는 이름으로 충분할 것입니다. – Greg

1

이것은 불가능합니다.

5

TryParse은 정적 방법입니다. 정적 메서드는 재정의 할 수 없습니다.

+0

이 작업을 수행하는 가장 좋은 방법은 바로 그때, 내 자신의 도우미 기능을 수 있을까요? – dlras2

+0

문자열 유형에 대한 고유 한 확장 방법을 작성하십시오. – jsmith

3

TryParse 정적 방법 당신은 정적 메서드를 재정의 할 수 없습니다.

당신은 항상 문자열이 당신이 원하는 것을 할 수 있도록 확장 방법을 만들려고 할 수 있습니다 : 당신은 TryParse을 재정의 할 수 없습니다

public static bool ParseYesNo(this string str, out bool val) 
{ 
    if(str.ToLowerInvariant() == "yes") 
    { 
     val = true; 
     return true; 
    } 
    else if (str.ToLowerInvariant() == "no") 
    { 
     val = false; 
     return true; 
    } 

    return bool.TryParse(str, out val); 
} 
+0

+1 out로 사용하지 마십시오 - 그냥 결과를 반환 –

+0

이 문제는 문자열이 유효한 부울 - true, false, yes, no, 1, 0인지 여부를 알기 위해 노력하고 있습니다."No"는 유효한 부울이지만 false를 반환합니다. – dlras2

+0

@ cyclotis04 - 귀하의 요구 사항을보다 잘 충족시키기 위해 제 대답을 업데이트했습니다. 이제 확장 메서드가 bool.TryParse()와 같이 작동합니다. 개인적으로, 나는 매개 변수 밖으로 큰 팬 아니에요. –

2

. 그러나 편의를 위해 string에 확장 방법을 만들 수 있습니다.

public static class StringExtension 
{ 
    public static bool TryParseToBoolean(this string value, bool acceptYesNo, out bool result) 
    { 
     if (acceptYesNo) 
     { 
      string upper = value.ToUpper(); 
      if (upper == "YES") 
      { 
       result = true; 
       return true; 
      } 
      if (upper == "NO") 
      { 
       result = false; 
       return true; 
      } 
     } 
     return bool.TryParse(value, out result); 
    } 
} 

그리고 그것과 같이 사용됩니다 :

public static class Program 
{ 
    public static void Main(string[] args) 
    { 
     bool result; 
     string value = "yes"; 
     if (value.TryParseToBoolean(true, out result)) 
     { 
      Console.WriteLine("good input"); 
     } 
     else 
     { 
      Console.WriteLine("bad input"); 
     } 
    } 
} 
+0

명백하게 나는 이것을 제안하는 유일한 사람이 아니다. –

관련 문제