代码之家  ›  专栏  ›  技术社区  ›  Hux

AutoMapper空源值和自定义类型转换器,无法映射?

  •  4
  • Hux  · 技术社区  · 11 年前

    当使用带有AutoMapper的自定义类型转换器(ITypeConverter)时,如果源值为 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的情况下进行映射?

    如果我指定了一个空字符串(“”),测试将按预期工作。

    1 回复  |  直到 11 年前
        1
  •  12
  •   edhedges    10 年前

    快速查看automapper的源代码,Mapper.Map(对象源)执行空检查。如果源为空,则返回默认值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;
        }