我正在尝试将派生类对象转换为它的基类(以通过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
))。每当我尝试强制转换时,该对象都会保留为PlanningListViewModel
对象,而我无法强制转换为其基类。
我在做什么错?感谢您的帮助!
答案 0 :(得分:0)
我需要访问基类的“计划”字段(因为派生类的“计划”字段已修改(覆盖get))。
在您的情况下,该属性无效,因为该属性不是虚拟的。您必须这样声明它:
public class PlanningListModel : INotifyPropertyChanged
{
…
public virtual List<PlanningEntryModel> Plannings {get=>_Plannings;}
}
然后像这样覆盖:
public class PlanningListViewModel : PlanningListModel
{
…
public override List<PlanningEntryModel> Plannings { … }
}
然后,对B.Plannigs
的调用将按您期望的方式工作,即调用PlanningListViewModel
类中声明的getter。
每当我尝试强制转换时,该对象都会保留一个PlanningListViewModel对象,而我无法强制转换为其基类。
是的,那是设计使然。以下两行是等效的:
PlanningListModel B = (PlanningListModel)A;
PlanningListModel B = A;
您看到甚至不需要显式强制转换。 cast 不会更改对象的类型(出于完整性的考虑,:在一种罕见的自定义重载转换运算符方案中,这是不正确的)。它只会影响您查看该对象的方式,即您看到的内容。