如何使用AutoMapper映射子对象?

Gil*_*rdo 1 .net c# automapper automapper-3

我不确定我是否在思考这个问题,但我无法解决这个问题.

我在这里有一个名为Template的父对象

public Template() 
{
    public long Id { get; set; }
    public Scoring SubProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的Scoring对象,它是Template的子属性

public enum MyEnum : short 
{
    Basic = 0
}

public Scoring()
{
    public MyEnum Type { get; set; }
    public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

public TemplateModel() 
{
    public long Id { get; set; }
    public string Type { get; set; }
    public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的AutoMapper配置文件中,我已经设置了这样,将模板转换为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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何将TemplateModel转换回模板?

如果我添加以下内容,我会得到一个异常,因为dest.Scoring.Type不是root属性.

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));
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.在这种情况下,Template必须始终具有Scoring对象,但在其他情况下,我具有可选属性.如果有人可以帮助我,那将是伟大的.

Ale*_*scu 6

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));
Run Code Online (Sandbox Code Playgroud)