将派生类显式转换为基类

时间:2019-09-09 11:07:43

标签: c# casting derived-class base-class

我正在尝试将派生类对象转换为它的基类(以通过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对象,而我无法强制转换为其基类。

我在做什么错?感谢您的帮助!

1 个答案:

答案 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 不会更改对象的类型(出于完整性的考虑,:在一种罕见的自定义重载转换运算符方案中,这是不正确的)。它只会影响您查看该对象的方式,即您看到的内容。

相关问题