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
有兴趣关注一下我的个人公众号,专注dotNet开发,谢谢

xamarin android如何将Java.Lang.Object类型转成C#类型的更多相关文章
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object
今天在进行代码检查的时候出现下面的异常: type parameters of <T>T cannot be determined; no unique maximal instance ...
- 解决本机安装多版本jdk导致The type java.lang.Object cannot be resolved It is indirectly referenced ...
本机开始安装了jdk1.6,然后安装了jdk1.8 当在调自动化的时候,发现传入函数传参String类型,报错The type java.lang.Object cannot be resolved ...
- 【典型错误】The type java.lang.Object cannot be resolved.
参考:http://blog.csdn.net/wo519074786/article/details/7697967 The type java.lang.Object cannot be reso ...
- JDK1.8源码(一)——java.lang.Object类
本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...
- Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null
1.Android Studio报错 Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' ...
- ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
错误堆栈: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[] at android ...
- jvm源码解读--01 jvm加载java/lang/object过程
现在做一下记录,这个看了两天,看的过程发现了很多c++的高级特性,没接触过,还得慢慢撸,禁止很慢 那么现在开始 吧 先打两个断点 java.c:351 JavaMain(void * _args) { ...
- java.lang.Object类与equals()及toString()的使用
1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...
随机推荐
- 0513JS数组的定义、遍历、添加
|数组|-定义方式|--1.new Array();|----空数组|------var attr = new Array();|------lenght:0|------_proto_: Array ...
- java(一、概念和开发工具)
Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...
- js创建数组
var a1 = new Array(); var a2 = new Array(7); var a3 = new Array(100,"0",true); var a4 = ...
- linux下安装nginx与配置
linux系统为Centos 64位 第一步:从http://nginx.org/download/上下载相应的版本(或者wget http://nginx.org/download/nginx-1. ...
- linux内核裁剪及编译可加载模块
一:linux内核裁剪: 1:编译内核源码: 今天的重点内容是内核驱动的编写,在编写驱动之前首先的了解linux内核源码,linux主要是由五个子系统组成:进程调度,内存管理,文件系统,网络接口以及进 ...
- Python并发编程之从生成器使用入门协程(七)
大家好,并发编程 进入第七篇. 从今天开始,我们将开始进入Python的难点,那就是协程. 为了写明白协程的知识点,我查阅了网上的很多相关资料.发现很难有一个讲得系统,讲得全面的文章,导致我们在学习的 ...
- mac升级到php7
使用homebrew安装php7 brew update #更新源 brew search php #查找源中的php,发现有php7.1版本,安装最新的php7.1 brew install php ...
- Javascript 设计模式 单例
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30490955 一直很喜欢Js,,,今天写一个Js的单例模式实现以及用法. 1.单 ...
- VM虚拟机下安装liunx系统
1.首先打开VMware看到如图所示,然后点击创建虚拟机,选择典型然后下一步 2.选择我稍后安装操作系统然后下一步,选择Linux系统然后下一步.给虚拟机起一个名字,和选择把虚拟机安装在那个位置.然后 ...
- Kafka的CommitFailedException异常
一.含义 CommitFailedException异常:位移提交失败时候抛出的异常.通常该异常被抛出时还会携带这样的一段话: Commit cannot be completed since the ...