使用基于类型内部泛型函数的特定类型

时间:2009-11-04 10:52:39

标签: c# generics

我想为一些类型设置泛型函数,例如long,TimeSpan和DateTime。

public static T Parse<T>(string text)
{
    T store;

    if(typeof(T) == typeof(TimeSpan)
        store = (T)((object) new TimeSpan(0, 1, 0));
    else
    {
        T.tryParse(text, out store);
    }
    return store;
}

有没有比双T /对象施放更好的方法?

t.tryParse没有编译,我怎样才能完成类似的东西?

1 个答案:

答案 0 :(得分:6)

在我看来,在这种情况下使用重载方法会更好。关于调用TryParse没有什么通用的 - Int32.TryParse是一种与Int64.TryParse等完全不同的方法。这也会让你远离双重投射(我同意这是丑陋的,但不幸的是很难避免)。这也意味着您要指定哪些类型可以真正支持。

另一种方法是使用Dictionary<Type, Func<string, object>>

// Add some error checking, obviously :)
Func<string, object> parser = parsers[typeof(T)];
return (T) parser(form.Text);

然后用以下内容设置字典:

static readonly Dictionary<Type, Func<string, object>> parsers = 
    new Dictionary<Type, Func<string, object>>()
{
    { typeof(int), x => int.Parse(x) },
    { typeof(TimeSpan) x => new TimeSpan(0, 1, 0) },
    ...
}

如果您想使用TryParse而不是Parse,则需要创建自己的委托类型,因为使用了out参数(Func不支持/ Action)。那时的生活变得有点困难。

顺便说一下,为什么使用out参数而不是返回值?