2011-12-12 103 views
1

如果我直到運行時才知道T是什麼,纔可以使用反射投射object類型的對象到MyType<T>使用反射投射到通用類型對象

+0

是;但是如果它的類型直到運行時才知道,你將無法編譯。 – vcsjones

+3

你能更好地指定你的場景嗎? –

+5

這沒有意義。 Casting是需要編譯時類型的編譯時操作。 – SLaks

回答

5

您不能將轉換爲編譯時未知的類型。鑄造實際上僅作爲編譯時構造有用,因爲您需要知道該類型才能直接使用它。

但是,如果您的目標是通過反射來處理對象,那麼情況就不同了。在這種情況下,您可以使用Type.MakeGenericType爲您的對象創建正確的類型。

這將允許您使用反射來處理您的對象。

+0

好的,但你將如何訪問通過反射創建的對象的成員?無論如何,你將不需要它的類型。鑄造問題依然存在。 –

+0

@ OlivierJacot-Descombes你需要知道關於這個類的東西 - 但不是它的具體類型。只要你知道一個屬性或方法的名字,你就可以發現它的類型並且調用它,等等(我同意,在大多數情況下,它沒有什麼用處 - 但有時候這是非常有用的。) –

1

在這種情況下的訣竅是使用非泛型類與泛型方法。

public class MyType 
{ 
    public T GetResult<T>() { 
    } 
} 

但是,請注意,這發生在編譯時。泛型讓您有機會在編譯時創建不同類型或方法的「風格」;但仿製藥是不是動態!泛型是類型安全的,只有在編譯時才能實現類型安全(因爲編譯器檢查類型安全性)。