如何在c#中编写泛型函数?

时间:2016-02-04 01:01:06

标签: c# generics

我正在尝试在c#中编写一个泛型函数,它试图根据类型解析字符串。

这是我试过的

    public static T convertString<T>(string raw)
    {
        if( typeof(T) == DateTime ){
            DateTime final;
            DateTime.TryParseExact(raw, "yyyy-mm-dd hh:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out final);
            return final;
         }

        if( typeof(T) == int ){
            int final;
            Int32.TryParse(raw, out final);
            return final;
        }

    }

如何更正此功能?

2 个答案:

答案 0 :(得分:4)

你可以尝试这样的事情:

public static bool TryConvertFromString<T>(string raw, out T result)
{
    result = default(T);
    var converter = TypeDescriptor.GetConverter(typeof (T));
    if (!converter.IsValid(raw)) return false;

    result = (T)converter.ConvertFromString(raw);
    return true;
}

// Usage
DateTime result;
if (!TryConvertFromString<DateTime>("this is not a date", out result))
{

}

编辑:支持TryConvert

否则,您可以创建一个尝试转换输入字符串的函数:

Mahout: Version 0.11.1

Spark: Version 1.5.0-cdh5.5.1

Java: 1.7.0_67

答案 1 :(得分:0)

如果类型U实现了IConvertible,你甚至可以做到更通用而不依赖于字符串参数 - 这意味着你必须指定两个类型参数:

 public static T ConvertValue<T,U>(U value) where U : IConvertible
    {
        return (T)Convert.ChangeType(value, typeof(T));
    }