像我有一個方法,一般的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