'How to map a child with automapper and convert using

I am using automapper to map from model to dto. In my model I want to use a string where in my dto I use an Enum. While it is a nested child, I am using ForPath instead ForMember. To convert to string is easy, however to convert the string back to type I wrote a ValueConverter. Using a ValueConverter in combination with ForMember is working excellent, however now I need to use it with ForPath which is not possible. Are there any other solutions to solve this problem, while I cannot find it in the automapper documentation or on stack.

This is my MappingProfile this part is working with member:

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));

this part I need ForPath and ConvertUsing, this code is not allowed

    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));

and this is my 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;
    }
}


Solution 1:[1]

I prefer additional maps within the same profile over using ForPath. This way I can still use my custom value resolvers:

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))
            ;
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Matthias Güntert