如何使用 Automapper 处理无效日期?

How to handle invalid dates with Automapper?

所以我有一个源数据库列,其中的日期类型是字符串,而不是日期,所以正如您所料,偶尔会有无效日期,例如“10-31-”。来源超出了我的控制范围,所以我无法在那里修复它(添加验证)。我正在使用 automaper(第 9 版)并且我一直在尝试使用 .MapFrom 但老实说,我对 Automapper 相当陌生并且不知道我在做什么。我已经阅读了文档,但对我没有帮助。

目标日期列可以为空,因此如果字符串不可转换为日期,我想得到一个空值。

CreateMap<Models.Orders, DTO.Orders>()
.ForMember(dest => dest.ap_birthday, opt => opt.AllowNull() );

您可以使用 type converter 实现此目的,例如:

public class DateTimeTypeConverter : ITypeConverter<string, DateTime?>
{
    public DateTime? Convert(string source, DateTime? destination, ResolutionContext context)
    {
        if (DateTime.TryParse(source, out DateTime result))
            return result;
        return null;
    }
}

这只是一个可能的类型转换器的例子。当字符串被成功解析时,你将得到一个 DateTime 结果,否则将返回 null 。当然,您可以根据需要调整转换。

然后您可以像这样使用转换器:

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<string, DateTime?>().ConvertUsing(new DateTimeTypeConverter());
        cfg.CreateMap<OrderDto, Order>();
    });
    var mapper = config.CreateMapper();

    var orderDTO = new OrderDto();
    orderDTO.id = 1;
    orderDTO.orderDate = "2020-01-01";

    var order = mapper.Map<Order>(orderDTO); // orderDate will be "2020-01-01"

    orderDTO.orderDate = "10-31";
    var otherorder = mapper.Map<Order>(orderDTO); // orderDate will be null

cfg.CreateMap<string, DateTime?>()... 告诉 AutoMapper 每次需要从 string 转换为 DateTime? 时使用此转换器。

作为替代方案,您也可以使用 value converter.