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

时间:2012-02-09 04:00:14

标签: c# automapper

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

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

如果存在Answer,则需要将其映射到FormAnswerModel中的Answer属性,如果所有值都为null,则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}
}

2 个答案:

答案 0 :(得分: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;
                    }
                                                ));

答案 1 :(得分:2)

您可以使用自定义映射lambda方法,但似乎您需要更多逻辑。在这种情况下,自定义解析器似乎是一个不错的选择。

请参阅Automapper wiki

https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

在地图选项中,您可以指定opt.ResolveUsing<TResolver>()其中TResolver继承自ValueResolver<FormAnswer, string>

另外,如果我需要知道如何使用Automapper做一些事情,我发现单元测试提供了非常丰富的文档。

希望有所帮助。