簡體   English   中英

如何使用自動映射器 map 一個孩子並使用轉換

[英]How to map a child with automapper and convert using

我正在使用自動映射器從 model 到 map 到 dto。 在我的 model 中,我想在我的 dto 中使用枚舉的地方使用字符串。 雖然它是一個嵌套的孩子,但我使用的是 ForPath 而不是 ForMember。 轉換為字符串很容易,但是要將字符串轉換回類型,我編寫了一個 ValueConverter。 將 ValueConverter 與 ForMember 結合使用效果很好,但是現在我需要將它與 ForPath 一起使用,這是不可能的。 是否有任何其他解決方案可以解決此問題,而我在 automapper 文檔或堆棧中找不到它。

這是我的 MappingProfile 這部分正在與成員一起工作:

CreateMap<Dto, Model>()
            .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type.ToString()))
            .ReverseMap()
            .ForMember(dest => dest.Type, opt => opt.ConvertUsing(new StringToEnumConverter<Type>(), src => src.Type));

這部分我需要ForPath和ConvertUsing,這個代碼是不允許的

    CreateMap<Dto, Model>()
            .ForPath(dest => dest.Type, opt => opt.MapFrom(src => src.Parent.Type.ToString()))
            .ReverseMap()
            .ForPath(dest => dest.Parent.Type, opt => opt.ConvertUsing(new StringToEnumConverter<Type>(), src => src.Type));

這是我的ValueConverter:

public class StringToEnumConverter<T> : IValueConverter<string, T> where T : struct
{
    public T Convert(string source, ResolutionContext context)
    {
        if (!string.IsNullOrEmpty(source))
        {
            if (Enum.TryParse(source, out T result))
            {
                return result;
            }
        }

        return default;
    }
}

感謝 Lucian Bargaoanu,我提出了這個解決方案。 我將 valueConverter 重寫為 static class 並使用 MapFrom 進行轉換。

 public static class StringEnumExtension
{
    public static TaskType ToTaskType(this string source)
    {
        return ToEnum<TaskType>(source);
    }

    public static TaskQuestionType ToTaskQuestionType(this string source)
    {
        return ToEnum<TaskQuestionType>(source);
    }

    private static T ToEnum<T>(string source) where T : struct
    {
        if (!string.IsNullOrEmpty(source))
        {
            if (Enum.TryParse(source, out T result))
            {
                return result;
            }
        }

        return default;
    }
}

我更新了這樣的映射:

CreateMap<TaskDto, TaskModel>()
            .ForPath(dest => dest.TaskType, opt => opt.MapFrom(src => src.TaskDefinition.TaskType.ToString()))
            .ReverseMap()
            .ForPath(dest => dest.TaskDefinition.TaskType, opt => opt.MapFrom(src => src.TaskType.ToTaskType()));

與使用ForPath ,我更喜歡同一配置文件中的其他地圖。 這樣我仍然可以使用我的自定義值解析器:

public class DstObject
{
    public int AnotherProperty { get; set; }
    public DstChildObject DstChildObject { get; set; }
}

public class DstChildObject
{
    public string SomeProperty { get; set; }      
}

public class MyMappingProfile : Profile
{
    public MyMappingProfile()
    {
        this.CreateMap<SourceType, DstObject>()
            .ForMember(dst => dst.AnotherProperty, opt => opt.MapFrom(src => src.AnotherProperty))
            .ForMember(dst => dst.DstChildObject, opt => opt.MapFrom(src => src))
            ;

        this.CreateMap<SourceType, DstChildObject>()
            .ForMember(dst => dst.SomeProperty, opt => opt.MapFrom(src => src.SomeProperty))
            ;
    }
}

暫無
暫無

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

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