【发布时间】:2020-04-22 14:36:27
【问题描述】:
我正在使用 automapper 从模型映射到 dto。在我的模型中,我想使用一个字符串,在我的 dto 中我使用一个枚举。虽然它是一个嵌套的孩子,但我使用的是 ForPath 而不是 ForMember。转换为字符串很容易,但是将字符串转换回类型我写了一个 ValueConverter。将 ValueConverter 与 ForMember 结合使用效果很好,但是现在我需要将它与 ForPath 一起使用,这是不可能的。是否有任何其他解决方案可以解决此问题,而我在 automapper 文档或堆栈中找不到它。
这是我的映射配置文件 这部分正在与成员合作:
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;
}
}
【问题讨论】:
-
您总是可以通过为内部对象创建映射来避免
ForPath。 -
@LucianBargaoanu 但这是不可能的,因为它不是 2 个单独的对象
-
真的吗? :) 那么
Parent是什么? -
@LucianBargaoanu 我们可以映射两个父级,但是我们只需要来自父级的 1 个属性而不是完整的父级,因此我们选择使用 ForPath,否则我们的模型需要很多。所以在模型中它不是一个单独的对象,只有 1 个属性
-
ForPath不支持转换器(除非您想自己实现)。所以你要么改用MapFrom,要么放弃ForPath。
标签: c# asp.net-core automapper