xamarin android如何将Java.Lang.Object类型转成C#类型
问题起源
其实这个标题也可以换一个更准确一点,因为我遇到的问题是:
xamarin android中的Class继承了Java.Lang.Object ,将json序列化成c#类型时发现无法赋值,序列化的格式没问题,但是Class的属性值没有复制成功。
xamarin android做一个列表展示,使用的是RecyclerView,采用的是的一个第三库
https://github.com/code-jar/MaterialDesignDemo,
绑定到xamarin android中,最基本的使用方法如下:
public class FlowItemAdapter : BaseQuickAdapter, View.IOnClickListener { private Context context; public FlowItemAdapter(Context context, List<TestItemModel> data) : base(Resource.Layout.item_flowIndex, data) { this.context = context; } protected override void Convert(BaseViewHolder holder, Java.Lang.Object item) { var currentModel= item as Java.Lang.Object; }
我们会发现这个Convert方法第二个参数是一个Java.Lang.Object类型,所以列表项的实体类必须继承Java.Lang.Object
public class TestItemModel:Java.Lang.Object { public string Id { get; set; } }
在序列化json的时候就会出现无法赋值:
var data= JsonConvert.DeserializeObject<List< TestItemModel >>(jsonTest);
data的结构是集合,但是没有赋值成功。这一点让我怀疑应该这个TestItemModel继承了Java.Lang.Object 导致,后来思考了一下,能不能不继承java.lang.object呢
解决思路
TestItemModel是可以不继承java.lang.object,当然解决这个问题目前来说,只能放弃继承了,不然无法序列化赋值,非常麻烦。
不继承的话
FlowItemAdapter中重写抽象方法 convert,的第二个参数如何转化呢?正如标题所示,如何将java.lang.Object类型转成c#类型呢?
这个库的源码https://github.com/CymChad/BaseRecyclerViewAdapterHelper/blob/master/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.java
抽象方法Convert的第二个参数是个泛型,绑定到xamarin android中就编程了Java.Lang.Object
所以我们就需要这个java中的类型转成c#类型:代码如下就一个扩展方法:
public static class ObjectTypeHelper { public static T Cast<T>(this Java.Lang.Object obj) where T : class { var propertyInfo = obj.GetType().GetProperty("Instance"); return propertyInfo == null ? null : propertyInfo.GetValue(obj, null) as T; } }
实践结果
protected override void Convert(BaseViewHolder holder, Java.Lang.Object itemModel) { var currentModel = item.Cast<TestItemModel>(); }
之前用这个库是继承java.lang.object,当请求接口序列化json的时候才发现这个问题。
参考链接
https://stackoverflow.com/questions/6594250/type-cast-from-java-lang-object-to-native-clr-type-in-monodroid
- Android 报错 - 无法解析类型 java.lang.Object。从必需的 .class 文件间接引用了它
- 使用eclipse JDT compile class,解决 无法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例
- 在android程序中java.lang.OutOfMemoryError如何解决
- 使用eclipse JDT compile class,解决 无法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例
- android 如何分析java.lang.IllegalArgumentException: Cannot draw recycled bitmaps异常
- java中如何将Object类型转换为int类型
- java.lang.Object是如何成为默认父类的
- java.lang.Object是如何成为默认父类的
- attempting to use incompatible return type(返回类型boolean与java.lang.Object不兼容)
- 使用eclipse JDT compile class,解决 无法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例
- 当创建一个类时,java.lang.Object是如何成为新创建类的默认父类的?
- [Android] View.setTag(key,Object) (java.lang.IllegalArgumentException: The key must be an application-specific resource id.)
- android json解析java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1报错
- void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
- Android JAVA中如何利用泛型使方法动态返回不同类型
- maven error提示: 不兼容的类型: java.lang.Object无法转换为T
- 编译android,无法访问 java.lang.Object问题
- android工程中引入第三方JAR包后安装APK时老是提示找不到库文件 || Android如何将程序打成jar包 || 运行java.lang.noclassdeffounderror错误
- 无法解析类型 java.lang.Object。从必需的 .class 文件间接引用了它
- 关于问题:无法解析类型java.lang.Object