2010-06-11 63 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 2010-06-11 14:54:15

+0

'Nullables'確實很方便解析,但我試圖覆蓋現有的'TryParse'方法。現在我正在寫我自己的東西,我可能會這樣做。此外,我正在使用'StringComparison.OrdinalIgnoreCase',但沒有把它放在我的例子中,只是爲了讓它看起來更乾淨。最後,當你的輸出類型是「bool」時,爲什麼要將你的方法標記爲「TryParseBoolean」? (雖然我想如果你改用'Nullables',你需要這個命名。) – dlras2 2010-06-11 14:59:46

+0

@ cyclotis04 - 好的電話。由於out參數,名稱TryParse確實足夠。 – Greg 2010-06-11 15:09:55

1

這是不可能的。

5

TryParse是一種靜態方法。你不能重寫一個靜態方法。

+0

會做到這一點的最好辦法僅僅是我自己的一個輔助功能,然後呢? – dlras2 2010-06-11 14:41:30

+0

爲您的字符串類型編寫您自己的擴展方法。 – jsmith 2010-06-11 14:42:46

3

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將此項設置爲dosn't out out value - 只是返回結果 – 2010-06-11 14:50:56

+0

這個問題是我想知道如果字符串是有效的布爾 - 真,假,是,不,1,0。「否」是有效的布爾值,儘管它返回false。 – dlras2 2010-06-11 15:10:32

+0

@ cyclotis04 - 我更新了我的答案,以更好地滿足您的要求。現在擴展方法的行爲更像bool.TryParse()。就我個人而言,我不是一個很大的粉絲參數。 – 2010-06-11 15:48:14

2

不能覆蓋TryParse。但是,爲方便起見,您可以在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

顯然我不是唯一一個建議這個。 – 2010-06-11 14:53:40