簡體   English   中英

不能做(表達式產生System.Type)對象強制轉換?

[英]Can't do (expression yielding System.Type)object cast?

我有一個object []數組,其中包含一些內置類型的混合,比如Int / Byte / String,我試圖在運行時從對象轉換為正確的類型,然后將該轉換的數據交給第三方庫具有Write(內置類型重載)方法。

我以為我可以做Obj.Write((表達式產生System.Type)objArg),但它對我有誤。

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

    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] )
}

我一直在閱讀所有類似的聲音問題,看起來這可能是不可能的?

強制轉換是編譯時構造; 你不能在演員操作符中使用調用的結果。

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

如果您使用的是.NET 4:

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

否則,您將必須使用反射根據參數類型選擇正確的重載,然后調用它。

你正在尋找的東西是沒有意義的,因為結果仍然必須為所有操作都有一個類型,並且必須是處理所有不同類型的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 + "'.");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM