我正在开发一种移动应用程序,除此之外,它还通过蓝牙从医疗设备接收数据。为此,我通过绑定到我的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的反编译源,我确定它确实是字节数组。
答案 0 :(得分:1)
在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
,因此可以将其用作TResult
的{{1}}参数。此外,它实现了JavaCast<TResult>
,因此您应该能够遍历它。
无论如何,如果您需要IList
,可以使用已投放的List<byte[]>
进行创建:
JavaList
或者
var dataBloodList = dataBlood.ToList();
您可以尝试的另一件事是将var dataBloodList = new List<byte[]>(dataBlood);
Java转换为dataBloodRaw
,然后循环遍历其对象,尝试将每个对象转换为JavaList<object>
。< / p>
计划B
如果上述方法都不奏效,建议您查看this answer建议禁用linking进行发布,这可以在您的项目属性:
请注意,最后一个选项的副作用是对应用程序最终大小的影响。