2011-06-10 96 views
2

我有這個現有的代碼工作得很好。返回(T)請求[key];

public static T SessionGet<T>(string key) 
{ 
    if (Session[key] == null) 
     return default(T); 
    else 
     return (T)Session[key]; 
} 

我想製作一個適用於Request的版本。我意識到請求是基於字符串的。那麼,如何更改代碼,以避免在下面的註釋中出現錯誤,而不必根據typeof(T)放置大型開關。

return (T)Request[key]; // Cannot cast expression of type 'string' to type '(T)' 

下面是函數....

public static T RequestGet<T>(string key) 
{ 
    if (Request[key] == null) 
     return default(T); 
    else 
     return (T)Request[key]; 
} 

謝謝

回答

6

可以使用Convert.ChangeType的方法來做到這一點,但你依靠輸入爲正確,否則你會得到一個例外。 Request涉及用戶提供的數據,所以這個假設是非常有有風險。這與Session所做的不一樣,因爲您控制進入Session的內容。 Request不是這種情況。

public static T RequestGet<T>(string key) 
{ 
    if (Request[key] == null) 
    { 
     return default(T); 
    } 
    else 
    { 
     return (T)Convert.ChangeType(Request[key], typeof(T)); 
     // return (T)Request[key]; 
    } 
} 

在你的鞋,我可能要依靠獲得,驗證和分析用戶輸入的安全方法,使應用程序不會變得異常處理或錯誤屏幕的混亂。

+0

太棒了! ChangeType對我來說是新的。 – 2011-06-14 01:33:33