zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Mysql数据查询
    Mysql数据类型
    desc和show
    Mysql权限管理
    深入理解inode和硬链接和软连接和挂载点
    Linux用户和组
    VIM文本编辑器
    Linux文件操作
    MySQL基础
    八大排序
  • 原文地址:https://www.cnblogs.com/zhangmumu/p/10289193.html
Copyright © 2011-2022 走看看