我在尝试映射日期时间时遇到问题?串起来, 如果源值为空,则不会执行扩展方法, 有人知道为什么吗? 我尝试了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; }
}
我期望结果应该返回“something”,但返回null
用于代码安全的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
为空日期时间。