8

如何将一个对象的属性映射到具有不同属性名称的另一个对象?

我有一个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);
}

我该怎么做?

4

2 回答 2

8

如果您使用的是 ValueInjecter,那么您将编写一个 ConventionInjection。在此处查看第二个示例

    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);
于 2011-11-07T12:29:15.467 回答
3

您可以使用AutoMapper轻松完成此操作。默认情况下使用约定(即 Id 映射到 Id 和 Name 到 Name),但您也可以定义自定义映射。

Mapper.CreateMap<Product, ProductSpecificationAddViewModel>()
    .ForMember(destination => destination.ProductName,
               options => options.MapFrom(
                    source => source.Name));

您的控制器映射代码将如此简单:

Mapper.Map(product, viewModel);
于 2011-11-07T12:23:50.857 回答