2010-06-11 18 views
7

boolTryParse yöntemini "evet" ve "hayır" kabul etme yöntemini geçersiz kılmak istiyorum. Kullanmak istediğim yöntemi biliyorum (aşağıda) ama bool'un yöntemini nasıl geçersiz edeceğimi bilmiyorum.TryParse'i nasıl geçersiz kılabilirim?

cevap

10

Statik bir yöntemi geçersiz kılabilirsiniz. Ancak bir uzantı yöntemi yaratabilirsiniz.

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

statik sınıfta koy ve çağrı kodunuzu böyle:

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

Şahsen, ayrıştırma yönteminin 'Null' ı döndürmesini seviyorum, burada dize ayrıştırılamıyorsa dönüş değeri 'null' olur. Bu bir out parametresi ihtiyacını ortadan kaldırır ve güzel çağrı sözdizimini sağlar. , ör. bool a = "blah" .ParseBool()? false; ' – Greg

+0

' Nullables' gerçekten ayrıştırma için kullanışlıdır, ancak mevcut 'TryParse' yöntemini geçersiz kılmaya çalışıyordum. Şimdi kendi başıma yazdığımda, muhtemelen böyle bir şey yapacağım. Ayrıca, 'StringComparison.OrdinalIgnoreCase' kullanıyorum ama sadece temiz görünmesini sağlamak için örneğime koymadım. Son olarak, çıkış türünüz bir "bool" olduğunda, neden 'TryParseBoolean' yönteminizi etiketlersiniz? ('Nullables' seçeneğine geçtiyseniz, bu isme ihtiyacınız varsayalım.) – dlras2

+0

@ cyclotis04 - İyi çağrı. Çıkış parametresi nedeniyle, 'TryParse' ismi gerçekten yeterli olacaktır. – Greg

1

Bu mümkün değil.

5

TryParse statik bir yöntemdir. Statik bir yöntemi geçersiz kılamazsınız.

+0

Bunu yapmanın en iyi yolu tam o sırada, kendime ait bir yardımcı fonksiyonu ile olabilir mi? – dlras2

+0

Dize türü için kendi uzantı yönteminizi yazın. – jsmith

3

TryParse statik bir yöntemdir ve statik yöntemleri geçersiz kılamaz.

Her zaman dizeleri istediğini yapmak için bir uzantısı yöntemi oluşturmak için deneyebilirsiniz: Sen TryParse geçersiz kılamaz

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 Bu değeri kullanamazsınız. sadece sonuç –

+0

döndürür Bu dize geçerli boolean - gerçek, yanlış, evet, hayır, 1, 0 olup olmadığını bilmek çalışıyorum."Hayır" geçerli bir booledir, ancak false döndürür. – dlras2

+0

@ cyclotis04 - Gereksinimlerinizi daha iyi karşılamak için cevabımı güncelledim. Uzantı yöntemi şimdi daha fazla bool.TryParse() gibi davranır. Şahsen, ben büyük bir yelpaze dışında parametreler değilim. –

2

. Ancak, kolaylık sağlamak için string'da bir uzantı yöntemi oluşturabilirsiniz.

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

Ve sonra şöyle kullanılacaktır:

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

Görünüşe göre bunu öneren tek kişi ben değilim. –

İlgili konular