[英]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 dataBloodRaw
到JavaList<object>
然后循环遍历其对象,尝试将它们中的每一个转换为byte[]
。
B计划
如果上述方法均无效,我建议您查看此答案,建议禁用 Release 链接,这可以在您的项目属性中完成:
请记住,最后一个选项的副作用将是对应用程序最终大小的影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.