C# 自动映射多个属性到单个属性

C# 自动映射多个属性到单个属性,c#,automapper,C#,Automapper,我需要帮助将我的域对象映射到ViewModel,以便与我的C#/MVC应用程序一起使用 在FormAnswer类中,只能有一种答案类型(AnswerCurrency、AnswerDateTime、AnswerBool等),这在数据库和应用程序逻辑中强制执行 如果答案存在,则需要将其映射到FormAnswerModel中的Answer属性。如果所有值均为null,则答案为空字符串 public class FormQuestion { public int Id {get; set;)

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

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

如果答案存在,则需要将其映射到FormAnswerModel中的Answer属性。如果所有值均为null,则答案为空字符串

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

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

请参阅Automapper wiki

在映射选项中,可以指定
opt.resolvesusing()
其中
TResolver
继承自
ValueResolver

此外,如果我需要知道如何使用Automapper,我发现单元测试提供了非常丰富的文档

希望这能有所帮助。

是一个很好的建议,特别是如果你在其他地方有这种模式。如果您正在寻找快速且肮脏的版本(也就是说,如果这是您需要处理此类情况的唯一地方),请尝试以下方法:

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;
        }
    ));
Mapper.CreateMap()
.FormMember(d=>d.答案,o=>o.ResolveUsing(fa=>
{
string-answer=string.Empty;
if(fa.AnswerBool.HasValue)
{
返回fa.AnswerBool.Value;
}
if(fa.AnswerCurrency.HasValue)
{
返回fa.AnswerCurrency.Value;
}
if(fa.AnswerDateTime.HasValue)
{
返回fa.AnswerDateTime;
}
如果(!String.IsNullOrEmpty(fa.AnswerString))
{
返回fa.AnswerString;
}
返回答案;
}
));

请参阅帖子中有关签名的常见问题解答。有点离题,但在该片段之后调用
ReverseMap()
可能会使其崩溃,我想是吧?有没有一种方法可以将其编写为一个双向工作的
IMappingExpression
;现在,无法知道是否应该将答案字符串转换为bool、double、Datetime等。即使有这些信息,我认为您仍然需要手动编写CreateMap。谢谢!这就是我现在正在做的。我只是希望有一个更聪明的方法从automapper 8.0开始,ResovleUsing被MapFrom取代。