2010-06-11 23 views
7

Ich möchte bool 's TryParse Methode überschreiben, um "Ja" und "Nein" zu akzeptieren. Ich kenne die Methode, die ich verwenden möchte (unten), aber ich weiß nicht, wie man die Methode bool überschreibt.Wie kann ich Tryparse überschreiben?

... 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); 
    } 
} 

Antwort

10

Sie können eine statische Methode nicht überschreiben. Sie könnten jedoch eine Erweiterungsmethode erstellen.

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); 
} 

dies in einer statischen Klasse Put und rufen Sie Ihren Code wie folgt:

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

Persönlich mag ich meine Parse-Methoden, 'Nullable <>' zurückzugeben, wobei der Rückgabewert "null" ist, wenn die Zeichenfolge nicht analysiert werden kann. Dies beseitigt die Notwendigkeit eines out-Parameters und sorgt für eine nette Aufrufsyntax. z.B. 'bool a =" bla ".ParseBool() ?? false; ' – Greg

+0

' Nullables 'sind in der Tat praktisch zum Parsen, aber ich habe versucht, die vorhandene' TryParse'-Methode zu überschreiben. Jetzt wo ich meine eigene schreibe, tho, werde ich wahrscheinlich so etwas tun. Außerdem verwende ich 'StringComparison.OrdinalIgnoreCase', habe es aber nicht in mein Beispiel eingefügt, um es sauberer aussehen zu lassen. Schließlich, warum würden Sie Ihre Methode 'TryParseBoolean' beschriften, wenn Ihr Out-Typ ein 'bool' ist? (Obwohl ich annehme, wenn Sie auf 'Nullables' wechselten, würden Sie diese Benennung benötigen.) – dlras2

+0

@ cyclotis04 - Guter Anruf. Wegen des out-Parameters wäre der Name 'Tryparse' in der Tat ausreichend. – Greg

1

Dies ist nicht möglich.

5

TryParse ist eine statische Methode. Sie können eine statische Methode nicht überschreiben.

+0

wäre der beste Weg, dies zu tun, nur mit einer Hilfsfunktion meines eigenen sein, dann? – dlras2

+0

Schreiben Sie Ihre eigene Erweiterungsmethode für den String-Typ. – jsmith

3

TryParse eine statische Methode ist, und Sie können nicht statische Methoden außer Kraft setzen.

könnten Sie immer versuchen, eine Erweiterungsmethode zu schaffen für Strings zu tun, was Sie wollen:

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 Bevorzugen Sie dies, da nicht aus Wert verwenden - gibt nur Ergebnis –

+0

Das Problem damit ist, ich versuche zu wissen, ob die Zeichenfolge gültig ist boolean - wahr, falsch, ja, nein, 1, 0."Nein" ist gültig boolesch, obwohl es false zurückgibt. – dlras2

+0

@ cyclotis04 - Ich habe meine Antwort aktualisiert, um Ihre Anforderungen besser zu erfüllen. Die Erweiterungsmethode verhält sich jetzt mehr wie bool.TryParse(). Persönlich bin ich jedoch kein großer Fan out Parameter. –

2

Sie nicht TryParse außer Kraft setzen können. Sie können jedoch aus praktischen Gründen eine Erweiterungsmethode unter string erstellen.

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); 
    } 
} 

Und dann wäre es wie so verwendet werden:

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

Anscheinend bin ich nicht der Einzige, der das vorschlägt. –

Verwandte Themen