viewModel作为viewModelExtended,cast?

时间:2011-03-22 14:10:55

标签: c# asp.net-mvc asp.net-mvc-2

我有如何做到这一点的问题。我有两节课; ProductViewModelProductExtendedViewModel

我的方案基本上是ProductExtendedViewModel继承了ProductViewModel,我想将ProductViewModel投射到ProductExtendedViewModel。我应该怎么做呢?

这是我迄今为止没有成功的尝试:

viewModelExtended = (ViewModelExtended) viewModel;

我得到的提示是,在投射数字时,该值必须是小于无穷大的数字

我在继承和铸造方面并不是那么棒,所以这对我来说都是一个新手,所以请理解有点新问题。

感谢

修改

public class ProductViewModel
{
    public string Name { get; set; }
    public Product Product { get; set; }
}

public class ProductExtendedViewModel : ProductViewModel
{
    public string ExtendedName { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

2 个答案:

答案 0 :(得分:3)

遗憾的是,在c#中你无法从基类型转换为派生类型(“向下转换”),因为你会尝试生成信息(即ExtendedName有什么值?)。

您最好的选择是通过合成完成此操作 - 在ProductExtendedViewModel上创建一个带有ProductViewModel的构造函数:

public class ProductExtendedViewModel : ProductViewModel
{
    public ProductExtendedViewModel()
    {
    }

    public ProductExtendedViewModel(ProductViewModel viewModel)
    {
        Name = viewModel.Name;
        Product = viewModel.Product;
    }

    public string ExtendedName { get; set; }
}

然后你可以打电话:

var productModel = new ProductViewModel {Name = product.Name, Product = product};

var derived = new ProductExtendedViewModel(productModel);

请注意,您仍然可以将Derived类型转换回其基类型,因为这会导致信息丢失:

var basetype = (ProductViewModel)derived;

我认为“当从一个数字[...]中投射时”的“故障排除提示”在这种情况下是一个红色的鲱鱼,并且只是对一般的施法有帮助。

答案 1 :(得分:1)

正如Zhaph所说,你不能在C#中贬低。他的解决方案的替代方案是使用AutoMapper来创建继承类的实例。这看起来像这样:

var productExtendedViewModel = Mapper.Map<ProductViewModel, ProductExtendedViewModel>(productViewModel);

请参阅文档以了解如何配置映射,但基本映射将按如下方式创建:

Mapper.CreateMap<ProductViewModel, ProductExtendedViewModel>();

AutoMapper是处理业务对象和视图模型之间所有映射的好工具。