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

Joh*_*Doe 3 c# automapper

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

例如:
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";
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在 AutoMapper 中做类似的事情吗?

var config = new MapperConfiguration(c =>
{
    c.CreateMap<SourceObj, DestinationObj>()
        .ForMember(x => x.Status, m => m.MapFrom([Not sure at this point]));
});
Run Code Online (Sandbox Code Playgroud)

编辑:

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);
}
Run Code Online (Sandbox Code Playgroud)

kri*_*gar 7

最简单的方法是将方法移到映射器类中。然后您可以在您的.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.
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅自定义值解析器