繁体   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