我有以下代码。
所有字段都可以很好地从源对象映射到目标对象。
但是,目标对象中有一个字段需要我计算。
例如:
可以根据DestinationObj.Status
。
SourceObj
如果我要编写代码,它看起来类似于:
foreach (var rec in listData)
{
string status;
if (!String.IsNullOrEmpty(rec.Field1))
{
status = "Stage 1";
}
if (!String.IsNullOrEmpty(rec.Field2))
{
status = "Stage 2";
}
if (!String.IsNullOrEmpty(rec.Field3))
{
status = "Stage 3";
}
}
我可以在AutoMapper中做类似的事情吗?
var config = new MapperConfiguration(c =>
{
c.CreateMap<SourceObj, DestinationObj>()
.ForMember(x => x.Status, m => m.MapFrom([Not sure at this point]));
});
编辑:
List<destinationObj> destinObj = new List<destinationObj>();
foreach (var rec in listSourceObject)
{
destinationObj do = new destinationObj();
// Manually map all of the fields...
string status;
if (!String.IsNullOrEmpty(rec.Field1))
{
do.status = "Stage 1";
}
if (!String.IsNullOrEmpty(rec.Field2))
{
do.status = "Stage 2";
}
if (!String.IsNullOrEmpty(rec.Field3))
{
do.status = "Stage 3";
}
destinObj.Add(do);
}
答案 0 :(得分:3)
使用MapFrom()
建议的解决方案和表达式的变通方法并不完全正确。 MapFrom()
(如AutoMapper: What is the difference between MapFrom and ResolveUsing?所示)更聪明,因此它可以处理嵌套的PropertyExpression
。
要处理映射值的常规函数,您应该使用ResolveUsing()
,它接受Func<>
,因此您可以直接输入代码,而无需修改要表示为{的调用。 {1}}。
答案 1 :(得分:2)
最简单的方法是将方法移动到mapper类中。然后,您可以在.MapFrom()
。
var config = new MapperConfiguration(c =>
{
c.CreateMap<SourceObj, DestinationObj>()
.ForMember(x => x.Status, m => m.MapFrom(src => MapStatus(src));
});
private string MapStatus(SourceObject source)
{
// Whatever that foreach loop actually does.
}