我试图将一个派生类对象强制转换为它的基类(通过JSON转换保存它)。每当我尝试从派生类对象获取基类时,它都会返回派生类的一个对象。我无法获得基类对象(尝试使用显式和隐式强制转换以及转换)。
public class PlanningListModel : INotifyPropertyChanged
{
private DateTime _date;
private List<PlanningEntryModel> _Plannings;
private bool _isSaving = false;
public List<PlanningEntryModel> Plannings {get=>_Plannings;} //field i want to serialize
//Same declarations for public fields
}
public class PlanningListViewModel :PlanningListModel INotifyPropertyChanged
{
private DateTime _date;
private List<PlanningEntryModel> _Plannings;
private bool _isSaving = false;
public List<PlanningEntryModel> Plannings{
get {
if (App.Data == null || App.Data.User == null || App.Data.IsReplicating)
return base.Plannings.FindAll(x => true);
switch (App.Data.CurrentList) {
case 0: return base.Plannings.FindAll(x => true);
case 1: return base.Plannings.FindAll(x => x.Volonter.ID == App.Data.User.ID);
case 2: return base.Plannings.FindAll(x => x.User.Referent==App.Data.User.ID);
default: return base.Plannings.FindAll(x => true);
}
}
}
我要做的是:
PlanningListViewModel A = new PlanningListViewModel ();
PlanningListModel B = (PlanningListModel)A;
typeof(B); // B stays PlanningListViewModel and not PlanningListModel
我需要访问基类的字段
我做错了什么?我非常感谢任何帮助!
我需要访问基类的字段Plannings(因为派生类的Plannings字段被修改(重写的get))。
在你的情况下,它不起作用,因为财产不是虚拟的。你必须这样声明:
public class PlanningListModel : INotifyPropertyChanged
{
…
public virtual List<PlanningEntryModel> Plannings {get=>_Plannings;}
}
然后重写如下所示:
public class PlanningListViewModel : PlanningListModel
{
…
public override List<PlanningEntryModel> Plannings { … }
}
那么对
每当我尝试强制转换时,对象保持PlanningListViewModel对象,我无法强制转换为它的基类。
是的,那是故意的。下面两行是等价的:
PlanningListModel B = (PlanningListModel)A;
PlanningListModel B = A;
你看,甚至不需要显式转换。强制转换不会更改对象的类型(为了完整性起见:在相当罕见的自定义重载转换运算符场景中,这是不正确的)。它只影响你如何看待那个对象,即你看到了什么。