public static void Main()
Console.WriteLine("Solution 1");
MapperConfiguration config = new MapperConfiguration(ctx => {
.ForMember(dest => dest.BoolValue, op => op.MapFrom((X src, Y dest) =>
return bool.TryParse(src.Value, out bool res) ? src.Value : null;
.ForMember(dest => dest.DateTimeValue, op => op.MapFrom((X src, Y dest) =>
return DateTime.TryParse(src.Value, out DateTime res) ? src.Value : null;
.ForMember(dest => dest.IntValue, op => op.MapFrom((X src, Y dest) =>
return int.TryParse(src.Value, out int res) ? src.Value : null;
.ForAllOtherMembers(dest => dest.Ignore());
IMapper mapper = config.CreateMapper();
X src = new X { Value = "1" };
Y dest = mapper.Map<Y>(src);
Console.WriteLine(JsonConvert.SerializeObject(dest));
X src2 = new X { Value = "false" };
Y dest2 = mapper.Map<Y>(src2);
Console.WriteLine(JsonConvert.SerializeObject(dest2));
X src3 = new X { Value = "2022-07-05T12:00:00Z" };
Y dest3 = mapper.Map<Y>(src3);
Console.WriteLine(JsonConvert.SerializeObject(dest3));
Console.WriteLine("---");
Console.WriteLine("Solution 2");
MapperConfiguration config2 = new MapperConfiguration(ctx => {
.ForMember(dest => dest.BoolValue, op => op.MapFrom<CustomValueResolver<bool?>>())
.ForMember(dest => dest.DateTimeValue, op => op.MapFrom<CustomValueResolver<DateTime?>>())
.ForMember(dest => dest.IntValue, op => op.MapFrom<CustomValueResolver<int?>>())
.ForAllOtherMembers(dest => dest.Ignore());
IMapper mapper2 = config2.CreateMapper();
src = new X { Value = "1" };
dest = mapper2.Map<Y>(src);
Console.WriteLine(JsonConvert.SerializeObject(dest));
src2 = new X { Value = "false" };
dest2 = mapper2.Map<Y>(src2);
Console.WriteLine(JsonConvert.SerializeObject(dest2));
src3 = new X { Value = "2022-07-05T12:00:00Z" };
dest3 = mapper2.Map<Y>(src3);
Console.WriteLine(JsonConvert.SerializeObject(dest3));
public class CustomValueResolver<T> : IValueResolver<X, Y, T?>
public T? Resolve(X source, Y destination, T? member, ResolutionContext context)
Type type = Nullable.GetUnderlyingType(typeof(T));
T? safeValue = source.Value != null
? (T?)Convert.ChangeType(source.Value, type)
public string Value {get; set;}
public bool? BoolValue {get; set;}
public DateTime? DateTimeValue {get; set;}
public int? IntValue {get; set;}