To map Objects that need Constructor Parameters using Automapper you need to use the ConstructUsing Method while Creating the Map.
See the Sample Console Applications below.

Sample Console Application C#

using System;
using AutoMapper;

namespace de.Fesslersoft.AutomapperConstructorTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Mapper.CreateMap<Item, Product>()
                .ConstructUsing(x => new Product(x.Id,x.Price)) //without this line there will be an System.Argumentexception
                .ForMember(destination => destination.Number, x => x.MapFrom(source => source.Id))
                .ForMember(destination => destination.Price, x => x.MapFrom(source => source.Price));

            var item = new Item {Id = "Testitem", Price = new decimal(145.69)};
            var product = Mapper.Map<Item, Product>(item);

            Console.WriteLine(product.Number); //prints Testitem
            Console.WriteLine(product.Price); //prints 145.69

            Console.Read();
        }

        internal class Item
        {
            public string Id { get; set; }
            public decimal Price { get; set; }
        }

        internal class Product
        {
            public string Number { get; set; }
            public decimal Price { get; set; }

            public Product(string number, decimal price)
            {
                Number = number;
                Price = price;
            }
        }
    }
}

Sample Console Application VB.NET (autoconverted code)

Imports AutoMapper

Namespace de.Fesslersoft.AutomapperConstructorTest
	Class Program
		Private Shared Sub Main(args As String())
			'without this line there will be an System.Argumentexception
			Mapper.CreateMap(Of Item, Product)().ConstructUsing(Function(x) New Product(x.Id, x.Price)).ForMember(Function(destination) destination.Number, Function(x) x.MapFrom(Function(source) source.Id)).ForMember(Function(destination) destination.Price, Function(x) x.MapFrom(Function(source) source.Price))

			Dim item = New Item() With { _
				Key .Id = "Testitem", _
				Key .Price = New Decimal(145.69) _
			}
			Dim product = Mapper.Map(Of Item, Product)(item)

			Console.WriteLine(product.Number)
			'prints Testitem
			Console.WriteLine(product.Price)
			'prints 145.69
			Console.Read()
		End Sub

		Friend Class Item
			Public Property Id() As String
				Get
					Return m_Id
				End Get
				Set
					m_Id = Value
				End Set
			End Property
			Private m_Id As String
			Public Property Price() As Decimal
				Get
					Return m_Price
				End Get
				Set
					m_Price = Value
				End Set
			End Property
			Private m_Price As Decimal
		End Class

		Friend Class Product
			Public Property Number() As String
				Get
					Return m_Number
				End Get
				Set
					m_Number = Value
				End Set
			End Property
			Private m_Number As String
			Public Property Price() As Decimal
				Get
					Return m_Price
				End Get
				Set
					m_Price = Value
				End Set
			End Property
			Private m_Price As Decimal

			Public Sub New(number__1 As String, price__2 As Decimal)
				Number = number__1
				Price = price__2
			End Sub
		End Class
	End Class
End Namespace

Leave a Reply