初始化视图使用基本模型中的值从基础模型继承的模型

时间:2017-11-10 14:13:08

标签: c#

我有一个返回Class1Model

的函数
Class1Model model = GetClass1Model();

我还有Class1ViewModel继承自Class1Model,我在视图中添加了一些仅用于格式化的属性。

public class Class1ViewModel : Class1Model  
{
    public string MyFormattedProperty => $"{base.Height:###.00} x {base.Width:###.00}" 
}

所以我希望我能做到这一点:

Class1Model model = GetClass1Model();
var viewModel = model as Class1ViewModel;

但这不起作用

那么通常会怎样做?

3 个答案:

答案 0 :(得分:2)

我建议使用合成方法而不是继承。

class Class1Model
{
    // model properties
}

class Class1ViewModel
{
    public Class1ViewModel(Class1Model model)
    {
        _Model = model;
    }

    private Class1Model _Model;
    public Class1Model Model { get { return _Model; } }

    // viewmodel specific extensions

    public string MyFormattedProperty => $"{Model.Height:###.00} x {Model.Width:###.00}"
}

如果您希望更改模型属性,则应使用某些弱事件侦听器订阅模型属性更改,并为依赖的viewmodel属性发出适当的属性更改事件。

答案 1 :(得分:0)

您正在尝试将基类型的实例强制转换为不允许的子类型。

Class1ViewModel是Class1Model。不是相反。

所以这会奏效:

Class1ViewModel viewModel = new Class1ViewModel();
Class1Model model = viewModel;

答案 2 :(得分:0)

一般情况下它没有意义(阅读this answer),所以我不确定提供通用解决方案是否是一个好主意。

你可以确实有一个,例如通过序列化技巧克隆:

using Newtonsoft.Json;

class Base
{
    public string A;
    public string B;
}

class Inherited : Base
{
    public string C = "c";
}

// in some method
var @base = new Base { A = "a", B = "b" };
var inherited = JsonConvert.DeserializeObject<Inherited>(JsonConvert.SerializeObject(@base));

inherited将复制@base个值(我使用的字段,也适用于属性)并且自己的值将是默认值。

这是非常慢的方法。请考虑使用手动复制:

var @base = new Base { A = "a", B = "b" };
var inherited = new Inherited { A = @base.A, B = @base.B, C = "whatever" };