2014-03-28 289 views
5

我想將對象轉換爲泛型類型。下面是一個例子方法:泛型類型轉換

void Main() 
{ 
    object something = 4; 
    Console.WriteLine(SomeMethod<int>(something)); 
    Console.WriteLine(SomeMethod<string>(something)); 
} 

public T SomeMethod<T>(object someRandomThing) 
{ 

    T result = Convert.ChangeType(someRandomThing, typeof(T)); 

    return result; 
} 

這給出了這樣的錯誤:

Cannot implicitly convert type 'object' to 'T'. An explicit conversion exists (are you missing a cast?)

我嘗試了好幾種變化讓我的結果轉換爲通用的類型,但它不是每次都工作了。

有沒有辦法使這個演員?

注意:在我的實際示例中,我從存儲過程中獲取「對象」。該方法可以調用幾個存儲過程中的一個,所以結果可能是一個字符串或一個int(或long),具體取決於調用哪個存儲過程。

+1

你應該避免把自己在這個位置在所有可能的成本。如果您調用兩個可能返回不同內容的過程,請將其中的一個包裝在方法調用中,該方法調用將類型更改爲所需的類型,以便在任何給定時間知道輸入的* actual *類型是。 – Servy

+0

@Servy - 我這樣做。有問題的方法是抽象掉數據庫管道的基本抽象類的受保護方法。 Public方法有幾個變體,看起來像'GetNewWidgetId()',它調用受保護的方法。 – Vaccano

+0

而不是讓抽象方法返回一個對象,讓它返回一個字符串或一個int;需要其中一個實現將其數據庫調用的返回值更改爲該方法要求它返回的內容。 – Servy

回答

10

Convert.ChangeType返回對象,所以你需要把結果回T

T result = (T)Convert.ChangeType(someRandomThing, typeof(T)) 
+1

我確定OP知道,但可能需要添加註釋,如果轉換不可能,您應該處理異常。 – Kevin

2

試試這個:

return (T)Convert.ChangeType(someRandomThing, typeof(T));