我有如何做到这一点的问题。我有两节课; ProductViewModel
和ProductExtendedViewModel
。
我的方案基本上是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; }
}
答案 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是处理业务对象和视图模型之间所有映射的好工具。