1. 程式人生 > >xamarin android如何將Java.Lang.Object類型轉成C#類型

xamarin android如何將Java.Lang.Object類型轉成C#類型

.get 題目 後來 main mon protected 必須 source ide

問題起源

其實這個標題也可以換一個更準確一點,因為我遇到的問題是:
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

xamarin android如何將Java.Lang.Object類型轉成C#類型