public static void Main()
var config = new MapperConfiguration(cfg => cfg.AddProfile<MyProfile>());
var mapper = config.CreateMapper();
var obj1 = mapper.Map<IDestination>(new Source());
Console.WriteLine("obj1.Prop should be MyStruct(10), because null value in Source should be ignored");
Console.WriteLine(JsonSerializer.Serialize(obj1));
var obj2 = mapper.Map<IDestination>(new Source() { Prop = 20 });
Console.WriteLine("obj2.Prop should be MyStruct(20), because Prop is 20m so it is mapped");
Console.WriteLine(JsonSerializer.Serialize(obj2));
public class MyProfile : Profile
CreateMap<decimal?, MyStruct>()
.ConvertUsing((source, dest) => source ?? dest);
CreateMap<Source, IDestination>()
.ConstructUsing((_, _) => new Destination())
.ForAllMembers(options => options.Condition((_, _, sourceMember) =>
return sourceMember != null;
public decimal? Prop { get; set; }
public class Destination : IDestination
public MyStruct Prop { get; set; }
public interface IDestination
MyStruct Prop { get; set; }
public decimal Value { get; private set; }
public MyStruct(decimal value)
public static implicit operator MyStruct(decimal val) => new MyStruct(val);