我的期望是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 程序集,则映射将成功。