![](/img/trans.png)
[英]How can I specify a custom mapping between certain types in 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.