2010-06-16 47 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