使用ValueInjecter在具有不同属性名称的对象之间进行映射

时间:2011-11-07 10:46:34

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 mapping valueinjecter

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

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

我该怎么做?

2 个答案:

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