Как отобразить ребенка с помощью автоматического преобразователя и конвертировать с помощью - PullRequest
0 голосов
/ 22 апреля 2020

Я использую Autopper для отображения из модели в DTO. В моей модели я хочу использовать строку, где в моем dto я использую Enum. Пока это вложенный ребенок, я использую ForPath вместо ForMember. Преобразовать в строку легко, однако, чтобы преобразовать строку обратно в тип, я написал ValueConverter. Использование ValueConverter в сочетании с ForMember работает отлично, однако теперь мне нужно использовать его с ForPath, что невозможно. Существуют ли другие решения для решения этой проблемы, хотя я не могу найти его в документации автопроизводителя или в стеке.

Это мой 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));

this часть мне нужны 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;
    }
}

1 Ответ

1 голос
/ 23 апреля 2020

Благодаря Lucian Bargaoanu я использую это решение. Я переписал valueConverter как простой класс c и использую 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()));
...