c# - 如何使用自动映射器映射子项并使用进行转换

标签 c# asp.net-core automapper

我正在使用自动映射器从模型映射到 dto。在我的模型中,我想使用一个字符串,在我的 dto 中我使用一个枚举。虽然它是一个嵌套子项,但我使用 ForPath 而不是 ForMember。转换为字符串很容易,但是为了将字符串转换回类型,我编写了一个 ValueConverter。将 ValueConverter 与 ForMember 结合使用效果非常好,但现在我需要将它与 ForPath 一起使用,这是不可能的。有没有其他解决方案来解决这个问题,虽然我在自动映射器文档或堆栈中找不到它。

这是我的映射配置文件 这部分正在与成员合作:

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 重写为静态类并使用 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()));

关于c# - 如何使用自动映射器映射子项并使用进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61367817/

相关文章:

c# - 将xml不同元素序列化为c#中的几个属性

c# - 如何防止 Microsoft Dynamics CRM 2011 中没有 ExecutionContext.CallerOrigin 的无限循环?

c# - Swagger - 如何显示更复杂的响应示例 - ASP.net Core Web API

c# - ASP.Net Core 中没有智能感知

.net - Automapper:使用 ReverseMap() 和 ForMember() 进行双向映射

c# - 为什么需要为部分 View 提供完整路径

c# - 无法从不同线程启动计时器

javascript - 无法在 JavaScript fetch() 中将请求正文发送到 API 端点

c# - AutoMapper映射多个模型并忽略不存在的属性

c# - 我应该把 AutoMapper 配置放在哪里?