如何将属性从对象映射到具有不同属性名称的另一个对象?
我有一个Product
类看起来像这样:
public class Product : IEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
视图模型如下:
public class ProductSpecificationAddViewModel
{
public int ProductId { get; set; }
public string ProductName { get; set; }
}
我需要进行以下映射:
Product.Id => ProductSpecificationAddViewModel.ProductId
Product.Name =>ProductSpecificationAddViewModel.ProductName
这是我的行动方法:
public ActionResult Add(int id)
{
Product product = productService.GetById(id);
// Mapping
//ProductSpecificationAddViewModel viewModel = new ProductSpecificationAddViewModel();
//viewModel.InjectFrom(product);
return View(viewModel);
}
我该怎么做?
答案 0 :(得分:8)
如果您正在使用ValueInjecter,那么您将编写一个ConventionInjection。请参阅第二个示例here
public class PropToTypeProp : ConventionInjection
{
protected override bool Match(ConventionInfo c)
{
return c.TargetProp.Name == c.Source.Type.Name + c.TargetProp.Name;
}
}
这个注入将从TSource。*的所有属性到TTarget.TSource + *,所以你这样做:
vm.InjectFrom<PropToTypeProp>(product);
答案 1 :(得分:3)
您可以使用 AutoMapper 轻松完成此操作。默认情况下使用约定(即Id映射到Id和Name to Name),但您也可以定义自定义映射。
Mapper.CreateMap<Product, ProductSpecificationAddViewModel>()
.ForMember(destination => destination.ProductName,
options => options.MapFrom(
source => source.Name));
您的控制器映射代码就这么简单了:
Mapper.Map(product, viewModel);