项目
版本

AutoMapper 属性映射

除流畅配置外,还可以通过属性声明和配置映射。属性映射可以补充或替代流畅映射配置。

类型映射配置

为了搜索要配置的映射,使用 AddMaps 方法:

var configuration = new MapperConfiguration(cfg => cfg.AddMaps("MyAssembly"));

var mapper = new Mapper(configuration);

AddMaps 会查找流畅映射配置(Profile 类)和基于属性的映射。

要声明一个属性映射,请使用 AutoMapAttribute 装饰目标类型:

[AutoMap(typeof(Order))]
public class OrderDto {
    // 目标成员

这等同于 CreateMap<Order, OrderDto>() 配置。

自定义类型映射配置

要自定义整体类型映射配置,可以在 AutoMapAttribute 上设置以下属性:

  • ReverseMap (bool)
  • ConstructUsingServiceLocator (bool)
  • MaxDepth (int)
  • PreserveReferences (bool)
  • DisableCtorValidation (bool)
  • IncludeAllDerived (bool)
  • TypeConverter (Type)
  • AsProxy (bool)

这些都对应于类似的流畅映射配置选项。仅需要 sourceType 值来进行映射。

成员配置

对于基于属性的映射,您可以使用额外的配置来装饰单个成员。由于 C# 中属性的限制(例如,不支持表达式),可用的配置选项有些局限。

基于成员的属性在 AutoMapper.Configuration.Annotations 命名空间中声明。

如果基于属性的配置不可用或不起作用,您可以结合使用属性和配置文件的映射(尽管这可能会令人困惑)。

忽略成员

使用 IgnoreAttribute 忽略单个目标成员的映射和/或验证:

using AutoMapper.Configuration.Annotations;

[AutoMap(typeof(Order))]
public class OrderDto {
    [Ignore]
    public decimal Total { get; set; }

重定向到不同的源成员

无法在属性中使用 MapFrom 和表达式,但 SourceMemberAttribute 可以重定向到单独命名的成员:

using AutoMapper.Configuration.Annotations;

[AutoMap(typeof(Order))]
public class OrderDto {
    [SourceMember("OrderTotal")]
    public decimal Total { get; set; }

或者使用 nameof 运算符:

using AutoMapper.Configuration.Annotations;

[AutoMap(typeof(Order))]
public class OrderDto {
    [SourceMember(nameof(Order.OrderTotal))]
    public decimal Total { get; set; }

您不能使用此属性进行扁平化,只能重定向源类型成员(即,名称中没有 "Order.Customer.Office.Name" )。配置扁平化仅可通过流畅配置实现。

额外的配置选项

其他基于属性的配置选项包括:

  • MapAtRuntimeAttribute
  • MappingOrderAttribute
  • NullSubstituteAttribute
  • UseExistingValueAttribute
  • ValueConverterAttribute
  • ValueResolverAttribute

每个选项都对应相同的流畅配置映射选项。

在本文档中