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<Source, IDestination>()
.ConvertUsing((source, dest, context) => {
dest ??= new Destination();
dest.Prop = source.Prop.Value;
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);