2009-11-04 44 views
1

我想为几种类型(如long,TimeSpan和DateTime)提供通用函数。使用基于typeof内部通用函数的特定类型

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不能编译,我该怎么做到类似的东西?

+0

什么是编译错误? – Ucodia 2009-11-04 11:01:48

回答

6

我觉得在这种情况下最好有一个重载的方法。关于调用TryParse - Int32.TryParseInt64.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,你需要由于使用了输出参数(在Func/Action中不支持)创建您自己的代表类型。在这一点上,生活变得有点困难。

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

+0

解析函数的功能是匹配TryParse调用中的输出。我的问题只有一个实际的代码,它返回一个表示TryParse结果的布尔值。 我会很快看到答案,谢谢。 – hultqvist 2009-11-04 11:58:20

+0

为了回答您的问题,删除了该问题以保持我的问题为重点。 – hultqvist 2009-11-04 12:02:56

相关问题