2010-06-16 64 views
3

像我有一个方法,一般的T类型的值:如何返回基于

public T Get<T>(string key) 
{ 

} 

现在说我要回“你好”如果类型为字符串110011,如果是键入int。

我该怎么做?

typeof(T)似乎不起作用。

我最好要基于通用(串/ INT /长/等)的类型做一个switch语句,并返回的东西。

这可能吗?

+9

为什么不使用单独的方法呢?这只是为了使用泛型而使用泛型。 – SWeko 2010-06-16 14:52:32

回答

7

下应该工作

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; 
} 
+0

如果'if'结构中不存在'T',应该''value'可以初始化为'default(T)'而不是'null'以避免'NullReferenceException'? – 2010-06-16 15:14:08

+0

@Anthony,这是一个有效的建议。在这种情况下,虽然作者没有在意外的类型中指定行为,所以它可能最好是明确地通过:) – JaredPar 2010-06-16 15:19:11

+0

我认为NRE可能是好的,因为行为没有在'if - 如果',但后来我考虑了它的不一致性,因为引用类型可能是未处理的而* *不是*抛出。 – 2010-06-16 15:25:06

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的行为,那么您可能没有正确使用泛型,并且/或者应该考虑实现单独的特定于类型的方法。

2

由于T不是该方法的参数,它不能从使用中推断出来。所以,您当前的用法是:

int x = obj.Get<int>("key"); 

在这种情况下,为什么不只是返回object?你的用法是:

int x = (int)obj.Get("get"); 
3

我个人认为,这是通用的方法错误的思路。

泛型应该支持跨不同的对象类“通用”操作,其中的基本类型是无关紧要的。当然,排除将它约束到一个类层次结构的一个分支时......在这种情况下,通过直接编辑父类代码或扩展方法,将方法添加到父类中可能会更好。

你开始添加类型特定的代码到一个通用的方法,那一刻是你已经走了出界的,需要重新考虑一类特定的方法是否适合自己情况较好分钟。

2

如果您使用switch语句来分流由Type那么你的方法可能不是一个通用的一个很好的选择,因为这意味着你的方法有基于它的工作与Type不同的行为。一个通用的方法不应该在意。

+1

是的,Jared Par提出的解决方案让我觉得属于“只是因为你可以,并不意味着你应该”类别。公平地说,他试图解决OP的问题。真正的问题是这个问题本身反映了一种不好的方法。 – silverfox1948 2017-04-11 18:49:05