2010-06-11 9 views
7

Desidero ignorare il metodo TryParse per accettare "sì" e "no". Conosco il metodo che voglio usare (sotto) ma non so come sovrascrivere il metodo di bool.Come posso ignorare 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); 
    } 
} 

risposta

10

Non è possibile sovrascrivere un metodo statico. Potresti comunque creare un metodo di estensione.

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

mettere questo in una classe statica, e chiamare il codice come questo:

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

Personalmente, mi piace che i miei metodi Parse restituiscano 'Nullable <>', dove il valore restituito è 'null' se la stringa non può essere analizzata. Ciò elimina la necessità di un parametro out e rende piacevole la sintassi delle chiamate. ad es. 'bool a =" blah ".ParseBool() ?? false; ' – Greg

+0

' Nullables' sono davvero utili per l'analisi, ma stavo cercando di ignorare il metodo 'TryParse' esistente. Ora che sto scrivendo il mio, anche io probabilmente farò qualcosa del genere. Inoltre, sto usando 'StringComparison.OrdinalIgnoreCase' ma non l'ho messo nel mio esempio solo per renderlo più pulito. Infine, perché dovresti etichettare il tuo metodo 'TryParseBoolean' quando il tuo tipo è un 'bool'? (Anche se suppongo che se si è passati a 'Nullables', avresti bisogno di tale denominazione.) – dlras2

+0

@ cyclotis04 - Buona chiamata. A causa del parametro out, il nome 'TryParse' sarebbe effettivamente sufficiente. – Greg

1

Questo non è possibile.

5

TryParse è un metodo statico. Non è possibile sovrascrivere un metodo statico.

+0

Sarebbe il modo migliore per farlo essere solo con una funzione di supporto della mia, allora? – dlras2

+0

Scrivi il tuo metodo di estensione per il tipo di stringa. – jsmith

3

TryParse è un metodo statico e non è possibile sostituire i metodi statici.

Si può sempre cercare di creare un metodo di estensione per le stringhe di fare ciò che si vuole:

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 Preferisci questo come non usare il valore di uscita - restituisce solo i risultati –

+0

Il problema con questo è che sto cercando di sapere se la stringa è valida boolean - true, false, yes, no, 1, 0."No" è booleano valido, anche se restituisce false. – dlras2

+0

@ cyclotis04 - Ho aggiornato la mia risposta per soddisfare meglio le vostre esigenze. Il metodo di estensione ora si comporta più come bool.TryParse(). Personalmente, non sono un grande fan dei parametri. –

2

Non è possibile ignorare TryParse. Tuttavia, è possibile creare un metodo di estensione su string per comodità.

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

E poi sarebbe stato utilizzato in questo modo:

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

Apparentemente non sono il solo a suggerire questo. –

Problemi correlati