Using ValueInjecter to map between objects with different property names

3.1k Views Asked by At

How do I map a property from an object to another object with a different property name?

I have a Product class that looks like this:

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

And the view model looks like:

public class ProductSpecificationAddViewModel
{
     public int ProductId { get; set; }
     public string ProductName { get; set; }
}

I need to do the following mapping:

Product.Id => ProductSpecificationAddViewModel.ProductId
Product.Name =>ProductSpecificationAddViewModel.ProductName

Here is my action method:

public ActionResult Add(int id)
{
     Product product = productService.GetById(id);

     // Mapping
     //ProductSpecificationAddViewModel viewModel = new ProductSpecificationAddViewModel();
     //viewModel.InjectFrom(product);

     return View(viewModel);
}

How would I do this?

2

There are 2 best solutions below

1
Chandermani On BEST ANSWER

If you are using ValueInjecter then you would write a ConventionInjection. See the second sample here

    public class PropToTypeProp : ConventionInjection
    {
        protected override bool Match(ConventionInfo c)
        {
            return c.TargetProp.Name == c.Source.Type.Name + c.TargetProp.Name;
        }
    }

this injection will do from all properties of TSource.* to TTarget.TSource+*, so you do:

vm.InjectFrom<PropToTypeProp>(product);
3
rouen On

You can do this easily with AutoMapper. By default is uses convention (i.e. Id maps to Id and Name to Name), but you can also define custom mappings.

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

Your contoller mapping code will be then this simple :

Mapper.Map(product, viewModel);