簡體   English   中英

Automapper 將多個屬性映射到單個屬性

[英]Automapper Mapping Multiple Properties to Single Property

我需要幫助將我的域對象映射到 ViewModel 以與我的 C#/MVC 應用程序一起使用

在 FormAnswer 類中只能有 1 種答案類型(AnswerCurrency、AnswerDateTime、AnswerBool 等),這是在數據庫和應用程序邏輯中強制執行的。

如果答案存在,則需要映射到 FormAnswerModel 中的答案屬性,如果所有值都為空,則答案為空字符串。

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}
}

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

您可以使用自定義映射 lambda 方法,但似乎您在這里需要更多邏輯。 在這種情況下,自定義解析器似乎是一個不錯的選擇。

參見 Automapper 維基

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

在映射選項中,您可以指定opt.ResolveUsing<TResolver>()其中TResolver繼承自ValueResolver<FormAnswer, string>

另外,如果我需要知道如何使用 Automapper 做某事,我發現單元測試提供了非常豐富的文檔。

希望有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM