在我们的一个项目中,我们使用 .NET Automapper(版本 10.1.1)。在其他情况下,我们意识到使用 AutoMapper 过于复杂,并转向直接手动映射,这样更快、更灵活(我自己也更喜欢这种方法)。
无论如何,我们有下一个后端模型
TextDocumentItem
,它具有下一个属性:
public bool RichTextFormatting { get; set; }
根据
RichTextFormatting
属性是否为 true,我们希望将其映射到 RichTextBoxObjectApi,反之亦然到 TextBoxObjectApi。
this.CreateMap<TextDocumentItem, TextBoxObjectApi>();
this.CreateMap<TextDocumentItem, RichTextBoxObjectApi>();
Automapper 支持这样的东西吗?我在看
.If
方法?
在预编码中:
this.CreateMap<TextDocumentItem, TextBoxObjectApi>()
.If(src => src.RichTextFormatting === true);
this.CreateMap<TextDocumentItem, RichTextBoxObjectApi>();
.If(src => src.RichTextFormatting === false);
在 AutoMapper 中执行映射时,您必须提供目标类型。因此,您应该实现确定要映射的类型的逻辑,而不是依赖 AutoMapper(据我所知,没有这样的功能)。
如果您尝试根据其类型执行进一步的逻辑,您可能会为
TextBoxObjectApi
和 RichTextBoxObjectApi
类定义一个(公共)接口。
public ITextBoxObjectApi MapTextDocumentItem(IMapper _mapper, TextDocumentItem source)
{
if (source.RichTextFormatting)
return _mapper.Map<RichTextBoxObjectApi>(source);
else
return _mapper.Map<TextBoxObjectApi>(source);
}
public class TextDocumentItem
{
}
public class TextBoxObjectApi: ITextBoxObjectApi
{
}
public class RichTextBoxObjectApi : ITextBoxObjectApi
{
}
来电者:
var mappedItem = MapTextDocumentItem(_mapper, /* TextDocumentItem instance */);
if (mappedItem is TextBoxObjectApi)
{
// Implementation for TextBoxObjectApi instance
}
else if (mappedItem is RichTextBoxObjectApi)
{
// Implementation for RichTextBoxObjectApi instance
}