我需要帮助将我的域对象映射到ViewModel以与我的C#/ MVC应用程序一起使用
在FormAnswer类中,只能有1种答案类型(AnswerCurrency,AnswerDateTime,AnswerBool等),这在数据库和应用程序逻辑中强制执行。
如果存在Answer,则需要将其映射到FormAnswerModel中的Answer属性,如果所有值都为null,则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}
}
答案 0 :(得分:17)
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;
}
));
答案 1 :(得分:2)
您可以使用自定义映射lambda方法,但似乎您需要更多逻辑。在这种情况下,自定义解析器似乎是一个不错的选择。
请参阅Automapper wiki
https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers
在地图选项中,您可以指定opt.ResolveUsing<TResolver>()
其中TResolver
继承自ValueResolver<FormAnswer, string>
另外,如果我需要知道如何使用Automapper做一些事情,我发现单元测试提供了非常丰富的文档。
希望有所帮助。