【问题标题】:Automapper Mapping Multiple Properties to Single PropertyAutomapper 将多个属性映射到单个属性
【发布时间】:2012-02-09 04:00:14
【问题描述】:

我需要帮助将我的域对象映射到 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}
}

【问题讨论】:

  • 请参阅有关帖子签名的常见问题解答。

标签: c# automapper


【解决方案1】:

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

【讨论】:

  • 有点跑题了,但我猜在那之后调用ReverseMap() sn-p 会使它崩溃?有没有办法把它写成一个双向的IMappingExpression
  • @cmxl 在您这样做之前,您必须向 FormAnswerModel 添加一些类型数据;就像现在一样,无法知道您是否应该将 Answer 字符串转换为 bool、double、Datetime 等。即使有了这些信息,我认为您仍然必须手动编写 CreateMap .
  • 谢谢!这就是我现在正在做的事情。我只是希望有一个更聪明的方法。 ;)
  • 从 automapper 8.0 开始,ResovleUsing 被 MapFrom 取代。 docs.automapper.org/en/stable/…
【解决方案2】:

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

参见 Automapper 维基

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

在映射选项中,您可以指定opt.ResolveUsing&lt;TResolver&gt;(),其中TResolver 继承自ValueResolver&lt;FormAnswer, string&gt;

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

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多