首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将继承模型转换为视图模型

将继承模型转换为视图模型
EN

Stack Overflow用户
提问于 2015-01-19 21:41:08
回答 1查看 77关注 0票数 4

我找到了一个由多个项目组成的解决方案。其中一个项目包含模型。另一个包含(并使用) ViewModels。

为了将模型转换为查看模型,我通常会在VM项目中编写一个扩展方法,如下所示:

代码语言:javascript
复制
public static BananaVm ToVm(this Banana model)
{
   BananaVm vm = new BananaVm();
   vm.Taste = model.Taste;
   return vm;
}

然而,在我的项目中,香蕉模型继承了水果模型,而在我的VM项目中,我收到了一个水果。

因此,除非首先获得水果的类型并将其转换为fruit.ToVm(),否则我无法调用.ToVm(),如下所示:

代码语言:javascript
复制
var vm = ((Banana)fruit).ToVm();

考虑到我获得了多个不同的水果,我现在必须使用一个开关来首先找到正确的类型,然后将其转换为可以调用.ToVm()的类型--例如:

代码语言:javascript
复制
Fruit fruit = FruitService.GetAFruit();
switch(fruit.GetType().Name)
{
   case "Banana":
      return ((Banana)fruit).ToVm();
   case "Orange":
      etc...
}

我觉得被迫使用的开关语句对我来说似乎不是一个很好的练习(我得到了20多个不同的水果,因此需要20多个案例)。

有没有人有更好的解决方案可以避免开关语句?

注意,我不能在水果类本身中添加一个.ToVm方法,因为只有Vm项目有一个模型项目的引用。

EN

回答 1

Stack Overflow用户

发布于 2015-01-20 15:10:16

请注意,我不想回复评论,因为我有一些代码。

在我的工作场所,我们使用以下几个地方,我们从来没有任何问题:

代码语言:javascript
复制
public class Factory
{
    public static FruitVM GetFruitVM(Fruit fruit)
    {
        if (fruit == null)
            throw new ArgumentNullException("fruit");

        if (fruit is Banana)
            return new BananaVM((Banana)fruit);
        if (fruit is Orange)
            return new OrangeVM((Orange)fruit);

        throw new NotImplementedException(string.Format("The Factory doesn't carry this fruit {0}!", fruit.ToString()));
    }
}

// Usage example
Banana banana = GetBananaModelSomehow();
FruitVM fruitVM = Factory.GetFruitVM(banana);

我不知道这是不是你想要的,但就像我之前说过的,我们已经使用这个模式好几年了,这对我们来说很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28033945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档