2012-02-09 127 views
3

我需要帮助映射我的域对象的视图模型与我的C#/ MVC应用程序Automapper映射多个属性为单属性

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

如果存在一个答案,它将需要映射到FormAnswerModel中的答案属性,如果所有值都为空,那么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} 
} 
+1

请参阅关于帖子签名的FAQ。 – 2012-02-09 04:10:17

回答

13

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; 
        } 
               )); 
+0

有点偏离主题,但在该片段后面调用'ReverseMap()'会让它崩溃,我猜?有没有办法把它写成一个单向的'IMappingExpression',它可以在两个方向上工作? – cmxl 2016-02-10 15:56:28

+0

@cmxl在你这样做之前,你必须添加一些类型数据到FormAnswerModel;因为它是现在,没有办法知道你是否应该将答案字符串转换为布尔,双,日期时间等。 即使有了这些信息,我认为你仍然必须手动编写CreateMap 。 – 2016-02-11 15:33:07

+0

谢谢!这就是我现在正在做的事情。我只是希望有一个更聪明的方法。 ;) – cmxl 2016-02-11 15:49:59

1

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

见Automapper维基

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

在映射选项,你可以指定一个opt.ResolveUsing<TResolver>()其中来自ValueResolver<FormAnswer, string>

而且TResolver继承,如果我需要知道如何做一些与Automapper我发现,单元测试提供了非常丰富的文档。

希望有所帮助。