使用 Xamarin 的 Mono for Android 将便携式 Class 传递给 Activity

Passing a portable Class to an Activity with Xamarin's Mono for Android

我正在使用 Xamarin 开发一个应用程序,它将在 Windows Phone、iOS 和 Android 上发布。该项目包含大量用于所有三个版本的可移植代码。

目前我正在开发 Android 应用程序并遇到 运行 问题 - 我需要传递我的一个便携式 classes(一个简单的模型,其中包含一个几个原始值)转换为 activity。这应该是实现 IParcelable 的一个简单案例,但是因为这是一个可移植的 class 我不能简单地扩展 Java.Lang.Object,所以我不确定这会把我留在哪里。

如何让我的模型通过捆绑包传递给 activity 而无需更改便携式 class?

我正在谈论的一个非常简单的例子:

便携机型

// This cannot be changed
class MyModel {
  public int Number { get; set; }
  public string Text { get; set; }
}

实现IParcelable的模型

// I have tried this, however IParcelable requires inheriting from Javal.Lang.Object
// This throws a notimplementedexception
class MyParcelableModel : MyModel, IParcelable {
  public int DescribeContents()
  {
    return 0;
  }

  public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
  {
    dest.WriteInt(Number);
    dest.WriteString(Text);
  }
}

最后,这就是我想将此模型传递给 activity

的方式
var intent = new Intent(Activity, typeof(MyActivity));
var bundle = new Bundle();

bundle.PutParcelable("model", model); // 'model' is an instance of MyParcelableModel
intent.PutExtras(bundle);
Activity.StartActivity(intent);

只要您要在 Intent 中传递的数据最少,您就可以保持 class 不变,并使用 Json.NET 进行序列化。例如:

string jsonModel = JsonConvert.SerializeObject(myModel);
intent.PutExtra("model", jsonModel);

那么在你的另一个 Activity 中,它会是这样的:

string json = intent.getExtra("model");
Model model = JsonConvert.DeserializeObject<MyModel>(json);