2012-02-09 108 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我發現,單元測試提供了非常豐富的文檔。

希望有所幫助。