我如何映射一个子对象与AutoMapper



我不确定我是否想得太多了,但我不能解决这个问题。

这里有一个父对象叫做Template

public Template() 
{
    public long Id { get; set; }
    public Scoring SubProperty { get; set; }
}

这是我的scores对象,它是Template

的子属性
public enum MyEnum : short 
{
    Basic = 0
}
public Scoring()
{
    public MyEnum Type { get; set; }
    public string Text { get; set; }
}

我有一个TemplateModel定义,像这样,我想转换为

public TemplateModel() 
{
    public long Id { get; set; }
    public string Type { get; set; }
    public string Text { get; set; }
}

在我的AutoMapper配置文件中,我已经这样设置了,将Template转换为TemplateModel。

public class TemplateProfile : Profile
{
    protected override void Configure()
    {
        // converters
        this.CreateMap<TemplateType, string>().ConvertUsing(new TemplateTypeConverter());
        // models
        this.CreateMap<Template, TemplateModel>()
            .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Scoring.Type))
            .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Scoring.Text));
    }
    /// <summary>
    /// Convert TemplateType to string
    /// </summary>
    private class TemplateTypeConverter : ITypeConverter<TemplateType, string>
    {
        public string Convert(ResolutionContext context)
        {
            return context.SourceValue.ToString().ToLower();
        }
    }
}

如何将TemplateModel转换回模板?

如果我添加以下内容,我将得到一个异常,因为dest. score . type不是根属性。

this.CreateMap<TemplateModel, Template>()
    .ForMember(dest => dest.Scoring.Type, opt => opt.MapFrom(src => src.Type))
    .ForMember(dest => dest.Scoring.Text, opt => opt.MapFrom(src => src.Text));

非常感谢任何帮助。在这种情况下,Template必须总是有一个Scoring对象,但在其他情况下,我有可选的属性。如果有人能在这两方面都帮我,那就太好了。

this.CreateMap<TemplateModel, Template>()
    .ForMember(dest => dest.SubProperty, opt => opt.MapFrom(src => src));
this.CreateMap<TemplateModel, Scoring>()
    .ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type))
    .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Text));

相关内容

  • 没有找到相关文章

最新更新