如何在AutoMapper中添加自定义逻辑?

本文关键字:自定义 添加 AutoMapper | 更新日期: 2023-09-27 18:06:08

我有以下代码。
所有字段都很好地从源对象映射到目标对象。
但是,在目标对象中有一个字段需要计算。

例如

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

如何在AutoMapper中添加自定义逻辑?

最简单的方法是将方法移动到映射器类中。然后,您可以在.MapFrom()中访问该方法。

var config = new MapperConfiguration(c =>
{
    c.CreateMap<SourceObj, DestinationObj>()
        .ForMember(dest => dest.Status, opt => opt.MapFrom(src => MapStatus(src)));
});
private string MapStatus(SourceObject source)
{
    // Whatever that foreach loop actually does.
}

有关更多信息,请参见自定义值解析器

建议的MapFrom()解决方案和表达式的变通方法并不完全正确。MapFrom() (as AutoMapper): MapFrom和ResolveUsing有什么区别?建议)更聪明,所以它可以处理嵌套的PropertyExpression

要处理映射值的常规函数,应该使用ResolveUsing(),它接受Func<>,因此可以直接输入代码,无需将调用修改为表示为Expression<Func<>>