自动映射器不一致地自动解析字符串 ->日期时间

本文关键字:日期 时间 字符串 映射 不一致 | 更新日期: 2023-09-27 18:35:32

我的期望是AutoMapper(3.3.0)不会自动解析字符串 -> DateTime转换,即使字符串采用易于理解的格式也是如此。缺少默认字符串 -> DateTime 转换器在库作者 Jimmy Bogard 对这个 StackOverflow 答案的评论中指出(尽管是四年前):https://stackoverflow.com/a/4915449/1675729

但是,我有一个.NET Fiddle,它似乎表明AutoMapper默认情况下可以处理此映射:https://dotnetfiddle.net/dDtUGx

在该示例中,Zing 属性从 Foo 中的string映射到 Bar 中的DateTime,而无需指定自定义映射或解析程序。

但是,当此代码在我的解决方案单元测试中运行时(使用相同的 AutoMapper 版本),它会产生我期望的异常,即:

AutoMapper.AutoMapperMappingExceptionMissing type map configuration or unsupported mapping.
Mapping types:  
    String -> DateTime
    System.String -> System.DateTime
Destination path:
    Bar.Zing
Source value:
    Friday, December 26, 2014

是什么导致了这种不一致的行为?

为了完整起见,此处重现了 .NET Fiddle 中的代码:

using System;
using AutoMapper;
public class Program
{
    public static void Main()
    {
        var foo = new Foo();
        foo.Zing = DateTime.Now.ToLongDateString();
        Mapper.CreateMap<Foo, Bar>();
        var bar = Mapper.Map(foo, new Bar());
        Console.WriteLine(bar.Zing);
    }

    public class Foo
    {       
        public string Zing { get; set; }    
    }
    public class Bar 
    {
        public DateTime Zing { get; set; }
    }
}

自动映射器不一致地自动解析字符串 ->日期时间

我相信自Automapper v2.0以来,DateTime转换string由一个名为TypeConverterMapper的内部IObjectMapper处理,但从源代码来看,这似乎是特定于平台的:只有一些平台(.Net full,SL5,WinRT)提供此映射器。"可移植".Net 程序集没有此平台特定的映射器。

如果单元测试引用自动映射器 3.3.0 的可移植程序集,则会收到错误。如果他们引用完整的 .Net 4.0 程序集,则映射将成功。