2012-08-31 50 views
2

我想創建一個擴展方法string,說明字符串是一個有效的整數,雙精度,布爾或十進制。我對switch..case不感興趣,並試圖使用泛型。擴展方法來檢查一個字符串是否是有效的整數,雙精度,布爾等

擴展方法

public static bool Is<T>(this string s) 
{ 
    .... 
} 

使用

string s = "23"; 

if(s.Is<int>()) 
{ 
    Console.WriteLine("valid integer"); 
} 

我能不能上實現擴展方法成功。我正在尋找一些想法/建議...

+2

[爲什麼會出現在C#中沒有String.IsNumeric功能](http://stackoverflow.com/q/1508668/284240) –

+2

看看 http://stackoverflow.com/questions/ 2961656/generic-tryparse –

+0

@ArturUdod這就是我要找的。謝謝。 – VJAI

回答

2

這可能會實現使用Cast<>()方法:

public static bool Is<T>(this string s) 
    { 
     bool success = true; 
     try 
     { 
      s.Cast<T>(); 
     } 
     catch(Exception) 
     { 
      success = false; 
     } 
     return success; 
    } 

編輯

顯然這不是每次都有效,所以我在這裏找到了另一個工作版本:

public static bool Is<T>(this string input) 
{ 
    try 
    { 
     TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input); 
    } 
    catch 
    { 
     return false; 
    } 

    return true; 
} 

摘自here

+0

感謝您的回答。我會試一試,並將其標記爲答案。 – VJAI

-2

我會用一個try/catch

string a = "23"; 

try{ 

int b = a; 

Console.WriteLine("valid integer"); 

} 
catch 
{ 
Console.WriteLine("invalid integer"); 
} 
+1

建立之前發佈... –

+0

這不是一個很好的解決方案。 – varg

4

使用的TryParse:

string someString = "42"; 
int result; 
if(int.TryParse(someString, out result)) 
{ 
    // It's ok 
    Console.WriteLine("ok: " + result); 
} 
else 
{ 
    // it's not ok 
    Console.WriteLine("Shame on you"); 
} 
1

實現的例子:

public static class StringExtensions 
{ 
    public static bool Is<T>(this string s) 
    { 
     if (typeof(T) == typeof(int)) 
     { 
      int tmp; 
      return int.TryParse(s, out tmp); 
     } 

     if (typeof(T) == typeof(long)) 
     { 
      long tmp; 
      return long.TryParse(s, out tmp); 
     } 

     ... 

     return false; 
    } 
} 

用法:

var test1 = "test".Is<int>(); 
var test2 = "1".Is<int>(); 
var test3 = "12.45".Is<int>(); 
var test4 = "45645564".Is<long>(); 

同時也請注意,你應該採取一些其他的參數作爲輸入的方法,例如作爲IFormatProvider以讓用戶指定要使用的文化。

+0

感謝您的回答。但我對多個if語句不感興趣,我認爲他們使代碼很難維護。 – VJAI

+0

他們實際上打敗了使用泛型的全部目的 –

2

這就是你想要的;

public static bool Is<T>(this string s) 
{ 

    TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); 

    try 
    { 
     object val = converter.ConvertFromInvariantString(s); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
相關問題