自动映射将多个属性映射到单个属性

SPS*_*101 5 c# automapper

我需要帮助将我的域对象映射到ViewModel以与我的C#/ MVC应用程序一起使用

在FormAnswer类中,只能有1种答案类型(AnswerCurrency,AnswerDateTime,AnswerBool等),这在数据库和应用程序逻辑中强制执行.

如果存在Answer,则如果所有值都为null,则需要将其映射到FormAnswerModel中的Answer属性,Answer是一个空字符串.

public class FormQuestion
{
   public int Id {get; set;)
   public string DataType {get; set;} 
   public string Question {get; set;} 
}

public class FormAnswer
{
   public int Id {get; set;)
   public int QuestionId {get; set;)
   public double? AnswerCurrency {get;set}
   public dateTime? AnswerDataTime {get;set}
   public bool? AnswerBool {get;set}
   public string AnswerString{get;set}
   public string AnswerText{get;set}
}

public class FormAnswerModel
{
   public int Id {get; set;)
   public int QuestionId {get; set;)
   public string Answer{get;set}
}
Run Code Online (Sandbox Code Playgroud)

E.Z*_*art 17

ValueResolver是一个很好的建议,特别是如果你在其他地方有这种模式.如果你正在寻找一个快速和脏的版本(也就是说,如果这是你需要处理这种情况的唯一地方),试试这个:

Mapper.CreateMap<FormAnswer, FormAnswerModel>()
                .ForMember(d => d.Answer, o => o.ResolveUsing(fa =>
                    {
                        string answer = String.Empty;
                        if (fa.AnswerBool.HasValue)
                        {
                            return fa.AnswerBool.Value;
                        }

                        if(fa.AnswerCurrency.HasValue)
                        {
                            return fa.AnswerCurrency.Value;
                        }

                        if(fa.AnswerDateTime.HasValue)
                        {
                            return fa.AnswerDateTime;
                        }

                        if(!String.IsNullOrEmpty(fa.AnswerString))
                        {
                            return fa.AnswerString;
                        }

                        return answer;
                    }
                                                ));
Run Code Online (Sandbox Code Playgroud)

  • 从 automapper 8.0 开始,ResovleUsing 被 MapFrom 取代。http://docs.automapper.org/en/stable/8.0-Upgrade-Guide.html#resolveusing (3认同)