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
xamarin android如何將Java.Lang.Object類型轉成C#類型