我的方法如下:
public T Get<T>(string key)
{
}
现在说如果类型是字符串,我想返回“hello”,如果类型是int,则返回110011。
我该怎么做?
typeof(T)似乎不起作用。
我理想地想要做一个switch语句,并根据泛型的类型(string / int / long / etc)返回一些东西。
这可能吗?
答案 0 :(得分:10)
以下内容应该有效
public T Get<T>(string key) {
object value = null;
if ( typeof(T) == typeof(int) ) {
value = 11011;
} else if ( typeof(T) == typeof(string) ) {
value = "hello";
}
return (T)value;
}
答案 1 :(得分:4)
就个人而言,我认为这对于通用方法来说是一种糟糕的模式。
泛型应该支持跨底层类型无关紧要的不同对象类的“泛型”操作。当然,当你将它约束到类层次结构的一个分支时排除...在这一点上,你甚至可以通过直接编辑父类代码或扩展方法将方法添加到父类中。 / p>
您开始将类型特定代码添加到通用方法的那一刻就是您离开界限的那一刻,需要重新考虑特定类型的方法是否更适合您的情况。
答案 2 :(得分:3)
我不得不怀疑问题的真正意图是什么...... Get
方法是否应该从某种存储中检索指定key
的值?在那种情况下,我会想象像
public T Get<T>(string key)
{
// GetValue(key) returns a value of type object.
return (T)_storage.GetValue(key);
}
会更合适。到目前为止提出的答案根本没有使用key
参数(我认为这是合法的,因为原始问题试图根据T
的类型硬编码某种返回值,无论key
代表什么)。
通常使用泛型来提供通用行为,而不管您正在处理的类型。如果您开始引入switch
语句来根据方法的Type
修改行为,您可能没有正确使用泛型,和/或您应该考虑实现单独的,特定于类型的方法。
答案 3 :(得分:3)
如果您使用switch语句按Type
进行分类,那么您的方法可能不适合使用泛型,因为这意味着您的方法具有基于Type
的不同行为与...合作。一般方法不应该关心。
答案 4 :(得分:2)
由于T
不是此方法的参数,因此无法从使用中推断出它。那么,您当前的用法是:
int x = obj.Get<int>("key");
在这种情况下,为什么不返回object
?您的用法是:
int x = (int)obj.Get("get");