2010-06-11 65 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