gpt4 book ai didi

c# - 将继承模型转换为 View 模型

转载 作者:行者123 更新时间:2023-11-30 12:58:54 24 4
gpt4 key购买 nike

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

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

public static BananaVm ToVm(this Banana model)
{
BananaVm vm = new BananaVm();
vm.Taste = model.Taste;
return vm;
}

但是在我的项目中,Banana 模型继承自 Fruit 模型,在我的 VM 项目中我收到了一个水果。

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

var vm = ((Banana)fruit).ToVm();

鉴于我有多种不同的水果,我现在必须使用开关首先找到正确的类型,然后将水果转换为我可以调用 .ToVm() 的类型 - 例如:

Fruit fruit = FruitService.GetAFruit();
switch(fruit.GetType().Name)
{
case "Banana":
return ((Banana)fruit).ToVm();
case "Orange":
etc...
}

我觉得被迫使用的 switch 语句对我来说似乎不是一个好习惯(我有超过 20 种不同的水果,因此需要超过 20 个案例)。

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

请注意,我无法在水果类本身中添加 .ToVm 方法,因为只有 Vm 项目引用了 Model 项目。

最佳答案

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

在我的工作场所,我们在几个地方使用了以下内容,我们从未遇到过任何问题:

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);

我不确定这是否正是您要找的,但正如我之前所说,我们已经使用这种模式几年了,它对我们来说很好。

关于c# - 将继承模型转换为 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com