У меня возникла проблема при попытке сопоставить DateTime?
с string
,
если исходное значение равно нулю, оно не будет входить в метод расширения,
кто-нибудь знает почему?
а я пробую automapper 10.0 все нормально!
версия
Автокартограф 11.0
.Net6
ниже мой исходный код
void Main()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Date,
opt =>opt.MapFrom(src => src.Date.ToCommon()));
});
IMapper mapper = config.CreateMapper();
var source = new Source { Date = null };
var destination = mapper.Map<Destination>(source);
Console.WriteLine(destination.Date);
}
public static class Temp
{
public static string ToCommon(this DateTime? dateTime)
{
if (dateTime is null)
return "something";
return dateTime.Value.ToString("yyyy/MM/dd");
}
}
public class Source
{
public DateTime? Date { get; set; }
}
public class Destination
{
public string Date { get; set; }
}
Я ожидаю, что результат должен вернуть «что-то», но вернуть ноль
AutoMapper для безопасности кода проверит значение NULL и не будет выполнять и вызывать метод для объектов NULL. Как упомянул @dpant в комментарии, вы можете проверить эту проблему на GitHub: https://github.com/AutoMapper/AutoMapper/issues/2409
Но я нашел трюк, как заставить это работать:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Date, opt => opt.MapFrom(src => src.Date.ToCommon() ?? ""));
});
IMapper mapper = config.CreateMapper();
var sourceDateNull = new Source { Date = null };
var destinationDateNull = mapper.Map<Destination>(sourceDateNull);
Assert.Equal("something", destinationDateNull.Date);
При сопоставлении выше ваш метод расширения вызывается и заменит something
для нулевых дат и времени.
Такое поведение
MapFrom
обсуждается здесь. Проще говоря, AutoMapper автоматически проверяетnull
и не выполняетMapFrom
, когда значение равноnull
.