簡體   English   中英

如何在 AutoMapper 中添加自定義邏輯?

[英]How can I add custom logic in 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";
    }
}

我可以在 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);
}

最簡單的方法是將您的方法移動到您的映射器類中。 然后,您可以在.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() (正如AutoMapper:MapFrom 和 ResolveUsing 之間的區別是什么?建議)更智能,因此它可以處理嵌套的PropertyExpression

要處理映射值的常規函數​​,您應該使用ResolveUsing() ,它接受Func<> ,因此您可以直接輸入代碼,無需修改調用以表示為Expression<Func<>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM