我有一个返回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;
但这不起作用
那么通常会怎样做?
答案 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" };