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中,最基本的使用方法以下:java

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.Objectandroid

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呢git

解決思路

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#類型:代碼以下就一個擴展方法:github

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編程

相關文章
相關標籤/搜索