4

将自定义类型转换器 (ITypeConverter) 与 AutoMapper 一起使用时,如果源值为 ,则似乎不会输入类型转换器代码null,例如:

Mapper.CreateMap<string, Enum>().ConvertUsing<EnumConverter>();

Assert.AreEqual(Enum.Value1, Mapper.Map<Enum>("StringValue1"));
Assert.AreEqual(Enum.Value1, Mapper.Map<Enum>(null);
Assert.AreEqual(Enum.Value1, Mapper.Map<Enum?>(null);

类型转换器看起来像:

public class EnumConvertor: ITypeConverter<string, Enum>
{
    public Enum Convert(ResolutionContext context)
    {
        string value = (string) context.SourceValue;

        switch (value)
        {
            case "StringValue2":
                return Enum.Value2;
            case "StringValue3":
                return Enum.Value3;
            case "StringValue1":
            default:
                return Enum.Value1;
        }
    }
}

在最后两种情况下,结果是:

Assert.AreEqual(Enum.Value1, Mapper.Map<Enum>(null);

0 - 不是有效的枚举值

Assert.AreEqual(Enum.Value1, Mapper.Map<Enum?>(null);

无效的

从调试到测试,在这两种情况下,自定义 TypeConverter 永远不会受到影响,而且 AutoMapper 似乎在映射器中进行了一些初始检查以进行映射,而无需求助于 TypeConverter?

如果我指定一个空字符串 (""),则测试按预期工作。

4

1 回答 1

12

快速浏览一下 automapper 的源代码,Mapper.Map(object source) 会进行 null 检查。如果 source 为 null,它将返回 T 的默认值:

    public TDestination Map<TDestination>(object source, Action<IMappingOperationOptions> opts)
    {
        var mappedObject = default(TDestination);
        if (source != null)
        {
            var sourceType = source.GetType();
            var destinationType = typeof(TDestination);

            mappedObject = (TDestination)Map(source, sourceType, destinationType, opts);
        }
        return mappedObject;
    }
于 2014-03-13T12:25:43.113 回答