我有一个泛型方法,它返回泛型类型的对象。一些代码:
public static T Foo<T>(string value)
{
if (typeof(T) == typeof(String))
return value;
if (typeof(T) == typeof(int))
return Int32.Parse(value);
// Do more stuff
}
我可以看到编译器可能会抱怨这个(“无法将类型'String'转换为'T'”),即使代码不会导致运行时出现任何逻辑错误。有没有办法实现我正在寻找的东西?施法无济于事......
答案 0 :(得分:19)
嗯,你可以这样做:
public static T Foo<T>(string value)
{
if (typeof(T) == typeof(String))
return (T) (object) value;
if (typeof(T) == typeof(int))
return (T) (object) Int32.Parse(value);
...
}
这将涉及拳击值类型,但它将起作用。
你确定这最好是作为单一方法完成,而不是(比如说)可以由不同转换器实现的通用接口吗?
或者,您可能需要这样的Dictionary<Type, Delegate>
:
Dictionary<Type, Delegate> converters = new Dictionary<Type, Delegate>
{
{ typeof(string), new Func<string, string>(x => x) }
{ typeof(int), new Func<string, int>(x => int.Parse(x)) },
}
然后你会像这样使用它:
public static T Foo<T>(string value)
{
Delegate converter;
if (converters.TryGetValue(typeof(T), out converter))
{
// We know the delegate will really be of the right type
var strongConverter = (Func<string, T>) converter;
return strongConverter(value);
}
// Oops... no such converter. Throw exception or whatever
}