2010-03-01 26 views
0

我有一個System.Type存儲在一個變量。我希望將對象的類型更改爲此類型。Convert.ChangeType到System.Type

我有以下代碼,但無法獲取類型更改爲類型。

理想情況下,我想:var intTest3 =(MyType)Convert.ChangeType(test, MyType);返回一個int,當:MyType is a System.Int32

,這裏是我迄今爲止的工作 - 我要去哪裏錯了?

 // object to cast to int 
     object test = 1; 

     // INT32 type 
     Type MyType = typeof(System.Int32); 

     // explicit type int WORKS 
     var intTest = (int)Convert.ChangeType(test, typeof(Int32)); 


     // explicit type to int WORKS 
     var intTest2 = (int)Convert.ChangeType(test, MyType); 

     // explicit type to int WORKS - but as object 
     object intTest3 = Convert.ChangeType(test, MyType); 


     // cast to my type DOESNT WORK 
     var intTest3 =(MyType)Convert.ChangeType(test, MyType); 

謝謝!

回答

2

這不是真的關於Convert.ChangeType - 這是關於鑄造。您正在投射的類型必須在編譯時間處已知,但它可能是通用類型。在這種情況下,就編譯器而言,MyType可以參考的任何類型。它不會「知道」它肯定會有價值typeof(int),所以它不會僅僅投射到int

在這種情況下,您希望intTest3的編譯時類型是什麼?

這裏的大圖是什麼?你真的想做什麼?您希望如何使用intTest3的值?

+0

這不是對問題的最好解釋,特別是因爲類型是硬編碼的。 – cjk 2010-03-01 13:52:52

+0

我正在翻譯2個API之間的數據。一個API提供一個包含數據的對象和一個包含這些數據的System.Type的變量。這些是在編譯時設置的。 其他API要求任何輸入是「正確的類型」 - 所以我不能只發送對象,但是,如果對象的類型是「Int32」,那麼它需要一個Int32變量。 所以我想這個問題是「如何將一個對象轉換爲一種類型,這隻在運行時才知道」。 – bob 2010-03-01 14:16:56

+0

@bob:你會期待這樣的演員要做什麼?你會如何使用結果?假設「var」不存在,因爲它在這裏不是真正相關的,否則你將如何聲明intTest3?你可以使用泛型方法嗎? (如果需要的話,可以讓你在'typeof(T)'中傳遞給'T'到'ConvertType')。如果你可以發佈更完整的代碼來使用你想要的任何東西,那將會有幫助。 – 2010-03-01 14:26:36

0

MyType是一個Type,它是一個包含struct/class定義信息的變量。將type置於括號內例如鑄造。 (int)value;要求括號中的項目是實際的類或結構,而不是變量。

4

這不應該。就C#而言,MyType不是「類型」,而是「Type」類型的變量。 「MyType」的「類型」是「類型」,但不能投1到「類型」。

在這種情況下,您已經進入了「reflection-land」,但您確實想要找到出路。我很抱歉,但是沒有辦法從這種情況下回到強類型的土地上。

一種解決方法,你可以嘗試但做的,是一般移動最後一行到另一個通用的方法,然後調用方法:

public static void LeaveReflectionLand<T>(object value) 
{ 
    T newItem = (T)value; 
} 

然後從外面,你必須這樣做這個:

this.GetType().GetMethod("LeaveReflectionLand", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(MyType).Invoke(null, test); 

但當然,這是一個巨大而可怕的解決方法。檢查喬恩Skeet的答案...我認爲它把事情清楚。

它的長和短,因爲MyType是Type類的一個實例,它可以代表任何類型。就編譯器而言,它就像int一樣。它本身並不是一個合適的「類型」,它是一個「描述」類型的變量。因爲它是一個描述類型的變量,所以在編譯時,編譯器無法知道MyType描述的實際類型,所以這種事情是不允許的。

這不是不像做這樣的事情:

int test = 1; 
int MyType = 2; 
int anotherTest = (MyType)test; 

顯然,你不能做到這一點。 MyType是Int32類型的變量。當MyType的類型是Type時也是如此,只有在這種情況下,MyType是Type類型的變量。

理解這一點的關鍵是「Type類」和「編譯器類型」之間的區別。

我希望這會有所幫助。用文字解釋並不是最容易的事情。

+0

非常清楚 - 謝謝! – bob 2010-03-01 14:09:17

相關問題