我编写了一个函数来检查数据类型int32
public static Int32? ParseInt32(this string text)
{
Int32 result;
if (!Int32.TryParse(text, out result))
return null;
return result;
}
如何扩展支持所有数据类型的函数???
感谢。
答案 0 :(得分: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>();
答案 1 :(得分: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;
}
}
}
答案 2 :(得分:1)
那么你可以使用泛型但是在方法体中你需要使用类型来解析它在特定的数据类型中。