2010-06-11 14 views
7

Chciałbym zastąpić metodę 'TryParse, aby zaakceptować "tak" i "nie". Znam metodę, którą chcę użyć (poniżej), ale nie wiem, jak zastąpić metodę bool.Jak mogę przesłonić 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); 
    } 
} 

Odpowiedz

10

Nie można zastąpić metody statycznej. Można jednak utworzyć metodę rozszerzenia.

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

umieścić to w klasie statycznej, i nazywają swój kod tak:

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

Osobiście lubię moje metody analizowania składni, zwracając 'Nullable <>', gdzie zwracana jest wartość 'null', jeśli nie można przeanalizować łańcucha. Eliminuje to potrzebę parametru out i sprawia, że ​​składnia wywołania jest przyjemna. np. 'bool a =" blah ".ParseBool()? false; ' – Greg

+0

' Nullables' są rzeczywiście przydatne podczas parsowania, ale próbowałem zastąpić istniejącą metodę 'TryParse'. Teraz, kiedy piszę własne, prawdopodobnie zrobię coś takiego. Ponadto używam 'StringComparison.OrdinalIgnoreCase', ale nie umieszczam go w moim przykładzie tylko po to, aby wyglądał czystszy. Na koniec, dlaczego miałbyś etykietować swoją metodę "TryParseBoolean", gdy twoim typem jest 'bool'? (Chociaż przypuszczam, że jeśli przełączysz się na 'Nullables', będziesz potrzebować tego nazewnictwa.) – dlras2

+0

@ cyclotis04 - Dobre połączenie. Ze względu na parametr out, nazwa 'TryParse' byłaby rzeczywiście wystarczająca. – Greg

5

TryParse to metoda statyczna. Nie można przesłonić metody statycznej.

+0

Czy najlepszym sposobem, aby to zrobić, po prostu być z funkcją pomocnikiem moim, a potem? – dlras2

+0

Napisz własną metodę rozszerzenia dla typu ciągu. – jsmith

3

TryParse jest metoda statyczna i nie można przesłonić metody statyczne.

Zawsze możesz spróbować stworzyć metodę rozszerzenia dla ciągów, aby robić to, co chcesz:

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 Preferuj to jako nie używaj wartości - po prostu zwraca wynik –

+0

Problem z tym jest próbuję wiedzieć, jeśli ciąg jest poprawny boolean - true, false, yes, no, 1, 0."Nie" jest prawidłową wartością logiczną, ale zwraca wartość false. – dlras2

+0

@ cyclotis04 - zaktualizowałem swoją odpowiedź, aby lepiej spełniać Twoje wymagania. Metoda rozszerzenia zachowuje się teraz bardziej jak bool.TryParse(). Osobiście nie jestem jednak wielkim fanem parametrów. –

2

Nie można zastąpić TryParse. Można jednak dla wygody utworzyć metodę rozszerzenia na 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); 
    } 
} 

I wtedy on być stosowany tak:

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

Wygląda na to, że nie jestem jedynym, który to zasugerował. –

Powiązane problemy