延長的TryParse我寫一個函數來檢查數據類型INT32對所有數據類型
public static Int32? ParseInt32(this string text)
{
Int32 result;
if (!Int32.TryParse(text, out result))
return null;
return result;
}
如何擴展該功能,支持所有數據類型???
謝謝。
延長的TryParse我寫一個函數來檢查數據類型INT32對所有數據類型
public static Int32? ParseInt32(this string text)
{
Int32 result;
if (!Int32.TryParse(text, out result))
return null;
return result;
}
如何擴展該功能,支持所有數據類型???
謝謝。
怎麼是這樣的:
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>();
這將拋出一個異常,如果它不能轉換(雖然很好用'Convert.ChangeType',並不知道那一個)。 – 2012-01-10 12:12:31
謝謝George,我意識到只要我點擊保存。更新爲捕獲解析異常。 – Will 2012-01-10 12:15:41
+1,比我現在強得多。 – 2012-01-10 12:17:06
這是一個最小的工作示例:
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;
}
}
}
所有數據類型? 'DateTime'怎麼樣? 'Process'? 'SqlException'?所有這些都是類型。 – Oded 2012-01-10 10:47:09
您可以使用泛型和反射,但所有數據類型可能不支持TryParse方法。所以在運行時調用它們可能會導致異常。因此,請具體說明您希望支持的數據類型? – Zenwalker 2012-01-10 10:47:57
只是int,DateTime,Long,Double – Pouya 2012-01-10 11:10:21