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