簡體   English   中英

C# Cast 僅適用於調試器

[英]C# Cast works only in debugger

我正在開發一個移動應用程序,其中包括通過藍牙從醫療設備接收數據。 為此,我通過綁定到我的 Xamarin 項目在 JAR 中使用 Android SDK。 這是保存從反編譯 JAR 返回的數據的類:

package com.contec.jar.contec08a;
import java.util.ArrayList;

    public class DeviceData
    {
      public ArrayList<byte[]> mData_blood = new ArrayList();
      public ArrayList<byte[]> mData_oxygen = new ArrayList();
      public ArrayList<byte[]> mData_normal_blood = new ArrayList();
    }

感興趣的是 mData_blood。 數組列表的每個元素對應一個患者。 每個字節數組是每個患者的醫療數據。 Xamarin 框架進行了一些更改,即屬性的名稱變為 MDataBlood。

問題:當我收到上述類和屬性時,轉換失敗但不在調試器中。 這就是我的意思:實現強制轉換的“as”運算符失敗(返回 null),但在調試器中,相同的表達式正確地顯示了數據。 此外,'is' 運算符在運行時返回 false(canDo 變量為 false),但在調試器中返回 true。 我已經嘗試了所有我熟悉的轉換方法,甚至使用——但不混合——Android 對象。 將 IList 轉換為 List 的突出顯示行產生了一個很好的異常。 我完全不知所措。 任何建議將不勝感激。

這是調試器的屏幕截圖,它說明了上述所有內容:

調試器會話屏幕截圖。

Edit1:MDataBlood[0] 評估為通用 Java 對象。 查看其屬性時,其 isArray 設置為 true。 通過檢查SDK的反編譯源,我確定它確實是字節數組。

在 Xamarin 中,當對象來自 java 類型時,有一些轉換可能會失敗。 在這種情況下,您應該使用JavaCast<TResult>而不是常規轉換。

試試這個,而不是你目前的方法:

// Since MDataBlood is exposed as an IList property of MDeviceData,
// we first need to cast it to IJavaObject
var dataBloodRaw = (IJavaObject)dm.MDeviceData.MDataBlood;

// Then we have access to its JavaCast method
var dataBlood = dataBloodRaw.JavaCast<JavaList<byte[]>>();

JavaList<T>擴展了Java.Lang.Object ,因此它可以用作JavaCast<TResult>TResult參數。 此外,它實現了IList ,因此您應該能夠遍歷它。

無論如何,如果您需要List<byte[]>您可以使用鑄造的JavaList來創建它:

var dataBloodList = dataBlood.ToList();

或者,或者

var dataBloodList = new List<byte[]>(dataBlood);

您可以嘗試的另一件事是將 Java dataBloodRawJavaList<object>然后循環遍歷其對象,嘗試將它們中的每一個轉換為byte[]

B計划

如果上述方法均無效,我建議您查看此答案,建議禁用 Release 鏈接,這可以在您的項目屬性中完成:

在此處輸入圖片說明

請記住,最后一個選項的副作用將是對應用程序最終大小的影響。

暫無
暫無

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

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