2012-01-10 68 views
0

延長的TryParse我寫一個函數來檢查數據類型INT32對所有數據類型

public static Int32? ParseInt32(this string text) 
     { 
      Int32 result; 
      if (!Int32.TryParse(text, out result)) 
       return null; 
      return result; 
     } 

如何擴展該功能,支持所有數據類型???

謝謝。

+0

所有數據類型? 'DateTime'怎麼樣? 'Process'? 'SqlException'?所有這些都是類型。 – Oded 2012-01-10 10:47:09

+0

您可以使用泛型和反射,但所有數據類型可能不支持TryParse方法。所以在運行時調用它們可能會導致異常。因此,請具體說明您希望支持的數據類型? – Zenwalker 2012-01-10 10:47:57

+0

只是int,DateTime,Long,Double – Pouya 2012-01-10 11:10:21

回答

3

怎麼是這樣的:

public static T? TryParse<T> (this string text) where T: struct 
{ 
    T? result = null; 

    if (!string.IsNullOrEmpty(text)) 
    { 
     try 
     { 
      result = (T?) Convert.ChangeType(text, typeof (T)); 
     } 
     catch (InvalidCastException) {} 
     catch (FormatException) {} 
     catch (OverflowException) {} 
    } 

    return result; 
} 

你可以這樣稱呼它:

int? myInt = "100".TryParse<int>(); 

DateTime? myDate = "2001-01-01T23.00.00".TryParse<DateTime>(); 
+0

這將拋出一個異常,如果它不能轉換(雖然很好用'Convert.ChangeType',並不知道那一個)。 – 2012-01-10 12:12:31

+0

謝謝George,我意識到只要我點擊保存。更新爲捕獲解析異常。 – Will 2012-01-10 12:15:41

+0

+1,比我現在強得多。 – 2012-01-10 12:17:06

1

那麼你可以利用泛型但在方法體中,你需要使用該類型來解析它在特定的數據類型。

你可以檢查此:Using Generic Extension Methods

+0

請採取抽樣 – Pouya 2012-01-10 11:11:32

2

這是一個最小的工作示例:

using System; 

namespace ConsoleApplication1 
{ 
    struct Test 
    { 
     // No TryParse method here! 
    } 

    static class Program 
    { 
     static void Main(string[] args) 
     { 
      var invalidTest = "12345".ParseTo<DateTime>(); 
      var validTest = "12345".ParseTo<int>(); 
      var veryInvalidTest = "12345".ParseTo<Test>(); 

      Console.WriteLine(!invalidTest.HasValue ? "<null>" : invalidTest.Value.ToString()); 
      Console.WriteLine(!validTest.HasValue ? "<null>" : validTest.Value.ToString()); 
     } 

     public static T? ParseTo<T>(this string test) where T : struct 
     { 
      var method = typeof(T).GetMethod("TryParse", new Type[] { typeof(string), typeof(T).MakeByRefType() }); 

      if (method == null) 
       throw new Exception(); // or return null or whatever 

      var parameters = new object[] { test, null }; 

      if ((bool)method.Invoke(null, parameters)) 
      { 
       return (T)parameters[1]; 
      } 
      else 
       return null; 
     } 
    } 
}