试图学习如何编写使用泛型类型的方法

时间:2016-06-07 18:32:45

标签: c# generics

我正在努力教会自己在可能的情况下创建方法时利用泛型类型。 是否可以将这两种方法组合成一种使用泛型类型的方法?

private Decimal? NullDec(string val)
{
    return String.IsNullOrEmpty(val) ? (Decimal?)null : Convert.ToDecimal(val);
}

private Int32? NullInt(string val)
{
    return String.IsNullOrEmpty(val) ? (Int32?)null : Convert.ToInt32(val);
}

2 个答案:

答案 0 :(得分:2)

可能使用Convert.ChangeType()实现类似您的方法,但我不确定是否可取

using System;

namespace Example
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            var @int = Foo<int>("3");
            var @double = Foo<double>("3.14");
            var dateTime = Foo<DateTime>("01/02/2016");
            var @decimal = Foo<decimal>("3.1");

            Console.WriteLine($"{@int} is a {@int.GetType()}");
            Console.WriteLine($"{@double} is a {@double.GetType()}");
            Console.WriteLine($"{dateTime} is a {dateTime.GetType()}");
            Console.WriteLine($"{@decimal} is a {@decimal.GetType()}");

            Console.ReadLine();
        }

        public static T? Foo<T>(string val) where T : struct, IConvertible
        {
            return string.IsNullOrEmpty(val) ? null : Convert.ChangeType(val, typeof(T)) as T?;
        }
    }
}

答案 1 :(得分:0)

我为你写了一些代码。

尝试这个

public class NullTest
{
    public T Null<T>(string val, Func<string, T> func)
    {
        return func(val);
    }
}

public class TestConvert
{
    public int? ConvertToInt32Null(string val)
    {
        if (string.IsNullOrWhiteSpace(val))
            return null;
        return Convert.ToInt32(val);
    }

    public decimal? ConvertToDecimalNull(string val)
    {
        if (string.IsNullOrWhiteSpace(val))
            return null;
        return Convert.ToDecimal(val);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var test = new NullTest();
        var converter = new TestConvert();

        int? t1 = test.Null("2", converter.ConvertToInt32Null);
        decimal? t2 = test.Null("", converter.ConvertToDecimalNull);
    }

}