投影是将源转换为目标,而不是展平对象模型。
如果没有额外配置,AutoMapper 需要一个经过展平的目标对象,用来匹配源类型的命名结构。
如果需要把源值投影到和源结构不完全匹配的目标对象上,就必须指定自定义成员映射定义。
举个例子,我们有如下源结构:
public class CalendarEvent
{
public DateTime Date { get; set; }
public string Title { get; set; }
}
public class CalendarEventForm
{
public DateTime EventDate { get; set; }
public int EventHour { get; set; }
public int EventMinute { get; set; }
public string Title { get; set; }
}Code language: JavaScript (javascript)
目标属性名称与源属性并不完全匹配(CalendarEvent.Date 需要映射到 CalendarEventForm.EventDate),因此我们要在类型映射配置里编写自定义成员映射:
// 构造源实体
var calendarEvent = new CalendarEvent
{
Date = new DateTime(2008, 12, 15, 20, 30, 0),
Title = "Company Holiday Party"
};
// 配置 AutoMapper
Mapper.Initialize(cfg =>
cfg.CreateMap<CalendarEvent, CalendarEventForm>()
.ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))
.ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))
.ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute)));
// 执行映射转换
CalendarEventForm form = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent);
form.EventDate.Equals(new DateTime(2008, 12, 15));
form.EventHour.Equals(20);
form.EventMinute.Equals(30);
form.Title.Equals("Company Holiday Party");Code language: JavaScript (javascript)
每一处自定义成员配置,都使用操作委托来配置独立的成员。
上面示例中,使用 MapFrom 选项实现源到目标成员的自定义映射。MapFrom 接收 lambda 表达式作为参数,映射执行阶段才会对该表达式求值。MapFrom 的参数可以是任意 lambda 表达式,签名为 Func<TSource, object>。