其實這個標題也能夠換一個更準確一點,由於我遇到的問題是:
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編程