项目
版本

AutoMapper 投影

投影将源对象转换到目标对象,不仅仅是扁平化对象模型。如果不进行额外配置,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; }
}

由于目标属性的名称与源属性并不完全匹配( CalendarEvent.Date 需要对应 CalendarEventForm.EventDate ),我们需要在类型映射配置中指定自定义成员映射:

// 模型
var calendarEvent = new CalendarEvent
{
    Date = new DateTime(2008, 12, 15, 20, 30, 0),
    Title = "公司年会"
};

// 配置 AutoMapper
var configuration = new MapperConfiguration(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.ShouldEqual(new DateTime(2008, 12, 15));
form.EventHour.ShouldEqual(20);
form.EventMinute.ShouldEqual(30);
form.Title.ShouldEqual("公司年会");

每个自定义成员配置都使用了一个动作委托来配置每个单独的成员。在上述示例中,我们使用了 MapFrom 选项来进行自定义源到目标成员映射。MapFrom 方法接受一个 lambda 表达式作为参数,该表达式在映射过程中后期求值。MapFrom 表达式可以是任何 Func<TSource, object> 类型的 lambda 表达式。

在本文档中