簡體   English   中英

AutoMapper空源值和自定義類型轉換器,無法映射?

[英]AutoMapper null source value and custom type converter, fails to map?

當使用帶有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?

如果我指定一個空字符串(“”),則測試將按預期工作。

快速查看一下automapper的源代碼,Mapper.Map(對象源)執行空檢查。 如果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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM