2012-01-28 35 views
0

我有一個對象[]數組,其中包含一些內置類型的混合,如Int/Byte/String,並且我試圖在運行時將對象轉換爲正確的類型,然後將該已轉換的數據交給第三個具有Write(內置類型重載)方法的第三方庫。我想我可以做Obj.Write((表達式產生System.Type)objArg),但它錯誤在我身上。不能做(表達式產生System.Type)對象轉換?

這裏是一個更好的解釋了它一個代碼示例:

object testData = (int)42; 
    int final = (GetAType())testData; 

    private Type GetAType() 
    { 
     return typeof(Int32); 
    } 

有什麼建議? 替代方法來實現這一點也會有所幫助。

對於某些情況下,這是我的原始問題。 第三方庫中有一堆針對不同類型的重載。

3rdPartyLibrary.Write(bool source) 
3rdPartyLibrary.Write(int16 source) 
3rdPartyLibrary.Write(int32 source) 
3rdPartyLibrary.Write(string source) 

我想3rdPartyLibrary之間和我的代碼

Such that I can have 
Object[int32] 
Object[int16] 
Object[string] 
Object[int32] 

我試圖做一些事情看似簡單,像這樣的(僞編碼)

其餘抽象層
loop Object[] 
{ 
    3rdPartyLibrary.Write((object[i].GetType()) object[i]) 
} 

我一直在閱讀所有類似的冠冕堂皇的問題,看起來這可能是不可能的?

+2

「我有一個Object []數組,它包含內建類型的一些混合,如int /字節/字符串」 - 有你的問題! – 2012-01-28 01:42:29

+1

Doh!這個問題的一個形式被問了很多次,但我找不到一個單一的重複。我吮吸。 – 2012-01-28 01:47:50

+0

'int final =(GetAType())testData;'編譯? – 2012-01-28 01:48:30

回答

1

您正在尋找的內容將毫無意義,因爲結果仍然必須爲所有操作提供單一類型,並且必須使用object來處理所有不同的類型。

只需使用一個開關爲你支持的類型:

foreach (object item in Object) { 
    switch (item.GetType().Name) { 
    case "System.Int16": 
     3rdPartyLibrary.Write((Int16)item); 
     break; 
    case "System.Int32": 
     3rdPartyLibrary.Write((Int32)item); 
     break; 
    case "System.Boolean": 
     3rdPartyLibrary.Write((bool)item); 
     break; 
    case "System.String": 
     3rdPartyLibrary.Write((string)item); 
     break; 
    default: 
     throw new ArgumentException("Unhandled type '" + item.GetType().Name + "'."); 
} 
1

演員是編譯時構造;您不能在演員操作中使用調用的結果。

有兩種方法可以解決您的問題。

如果您使用.NET 4:

3rdPartyLibrary.Write((dynamic)object[i]); 

否則,你將不得不使用反射來選擇基於參數類型正確的過載,然後調用它。