为所有DataType扩展TryParse

时间:2012-01-10 10:45:02

标签: c# .net

我编写了一个函数来检查数据类型int32

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

如何扩展支持所有数据类型的函数???

感谢。

3 个答案:

答案 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)

那么你可以使用泛型但是在方法体中你需要使用类型来解析它在特定的数据类型中。

你可以查看:Using Generic Extension Methods