像我有一个方法,一般的T类型的值:如何返回基于
public T Get<T>(string key)
{
}
现在说我要回“你好”如果类型为字符串110011,如果是键入int。
我该怎么做?
typeof(T)似乎不起作用。
我最好要基于通用(串/ INT /长/等)的类型做一个switch语句,并返回的东西。
这可能吗?
像我有一个方法,一般的T类型的值:如何返回基于
public T Get<T>(string key)
{
}
现在说我要回“你好”如果类型为字符串110011,如果是键入int。
我该怎么做?
typeof(T)似乎不起作用。
我最好要基于通用(串/ INT /长/等)的类型做一个switch语句,并返回的东西。
这可能吗?
下应该工作
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;
}
如果'if'结构中不存在'T',应该''value'可以初始化为'default(T)'而不是'null'以避免'NullReferenceException'? – 2010-06-16 15:14:08
@Anthony,这是一个有效的建议。在这种情况下,虽然作者没有在意外的类型中指定行为,所以它可能最好是明确地通过:) – JaredPar 2010-06-16 15:19:11
我认为NRE可能是好的,因为行为没有在'if - 如果',但后来我考虑了它的不一致性,因为引用类型可能是未处理的而* *不是*抛出。 – 2010-06-16 15:25:06
我想知道这个问题的真正意图是什么...是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
的行为,那么您可能没有正确使用泛型,并且/或者应该考虑实现单独的特定于类型的方法。
由于T
不是该方法的参数,它不能从使用中推断出来。所以,您当前的用法是:
int x = obj.Get<int>("key");
在这种情况下,为什么不只是返回object
?你的用法是:
int x = (int)obj.Get("get");
我个人认为,这是通用的方法错误的思路。
泛型应该支持跨不同的对象类“通用”操作,其中的基本类型是无关紧要的。当然,排除将它约束到一个类层次结构的一个分支时......在这种情况下,通过直接编辑父类代码或扩展方法,将方法添加到父类中可能会更好。
你开始添加类型特定的代码到一个通用的方法,那一刻是你已经走了出界的,需要重新考虑一类特定的方法是否适合自己情况较好分钟。
如果您使用switch语句来分流由Type
那么你的方法可能不是一个通用的一个很好的选择,因为这意味着你的方法有基于它的工作与Type
不同的行为。一个通用的方法不应该在意。
是的,Jared Par提出的解决方案让我觉得属于“只是因为你可以,并不意味着你应该”类别。公平地说,他试图解决OP的问题。真正的问题是这个问题本身反映了一种不好的方法。 – silverfox1948 2017-04-11 18:49:05
为什么不使用单独的方法呢?这只是为了使用泛型而使用泛型。 – SWeko 2010-06-16 14:52:32