将基本模型转换为子视图模型

时间:2016-12-15 09:49:20

标签: c# mvvm

我有一个名为DriverStaistic的模型和一个继承自它的视图模型 视图模型不包含任何额外的属性,它只是DriverStaistic的一个空继承,我这样做的原因是我从外部库接收模型对象,我想保持耦合到最小。 因为基类和子类包含相同的属性我想知道我们是否有一种简洁的方法在它们之间进行转换而不是使用lambda表达式,这需要我每次添加或省略属性时都要修改它

我已经使用反射推出了这个解决方案,但我相信它将来会出现性能问题。 任何人都可以提出更好的建议吗?

public static void FromDriverStatistic(this DriverStatisticsVm viewModel, object model)
{
    bool isDriverStatistic = model is DriverStatistic;

    if(!isDriverStatistic)
        throw  new InvalidCastException();

    var modelProperties = model.GetType().GetProperties();
    foreach (var property in modelProperties)
    {
        property.SetValue(viewModel, property.GetValue(model));
    }
}

1 个答案:

答案 0 :(得分:0)

  

我已经使用反射推出了这个解决方案,但我相信它将来会出现性能问题。任何人都可以提出更好的建议吗?

选项是逐个设置所有属性,即:

public static void FromDriverStatistic(this DriverStatisticsVm viewModel,  DriverStatistic model)
{
    viewModel.PropertyA = model.PropertyA;
    viewModel.PropertyB = model.PropertyB;
    //and so on...
}

这种方法的缺点显然是您必须在编译时知道所有属性名称,并在从任一类添加,删除或重命名属性时修改映射器方法。

另一种选择是使用反射,但缺点是你失去了编译时的安全性和一些性能。

你需要做出权衡决定。如果只设置了几个属性,那么使用反射支付的价格就不会那么高。您还应该能够为多个不同的视图模型/模型类型映射重用相同的方法或逻辑。因此,如果你想要灵活性,坚持使用反射。如果性能和编译时安全性至关重要,请不要这样做。