Attribute Mapping

In addition to fluent configuration is the ability to declare and configure maps via attributes. Attribute maps can supplement or replace fluent mapping configuration.

Type Map configuration

In order to search for maps to configure, use the AddMaps method:

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

var mapper = new Mapper(configuration);

AddMaps looks for fluent map configuration (Profile classes) and attribute-based mappings.

To declare an attribute map, decorate your destination type with the AutoMapAttribute:

[AutoMap(typeof(Order))]
public class OrderDto {
    // destination members

This is equivalent to a CreateMap<Order, OrderDto>() configuration.

Customizing type map configuration

To customize the overall type map configuration, you can set the following properties on the AutoMapAttribute:

  • ReverseMap (bool)

  • ConstructUsingServiceLocator (bool)

  • MaxDepth (int)

  • PreserveReferences (bool)

  • DisableCtorValidation (bool)

  • IncludeAllDerived (bool)

  • TypeConverter (Type)

  • AsProxy (bool)

These all correspond to the similar fluent mapping configuration options. Only the sourceType value is required to map.

Member configuration

For attribute-based maps, you can decorate individual members with additional configuration. Because attributes have limitations in C# (no expressions, for example), the configuration options available are a bit limited.

Member-based attributes are declared in the AutoMapper.Configuration.Annotations namespace.

If the attribute-based configuration is not available or will not work, you can combine both attribute and profile-based maps (though this may be confusing).

Ignoring members

Use the IgnoreAttribute to ignore an individual destination member from mapping and/or validation:

using AutoMapper.Configuration.Annotations;

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

Redirecting to a different source member

It is not possible to use MapFrom with an expression in an attribute, but SourceMemberAttribute can redirect to a separate named member:

using AutoMapper.Configuration.Annotations;

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

Or use the nameof operator:

using AutoMapper.Configuration.Annotations;

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

You cannot flatten with this attribute, only redirect source type members (i.e. no “Order.Customer.Office.Name” in the name). Configuring flattening is only available with the fluent configuration.

Additional configuration options

Additional attribute-based configuration options include:

  • MapAtRuntimeAttribute

  • MappingOrderAttribute

  • NullSubstituteAttribute

  • UseExistingValueAttribute

  • ValueConverterAttribute

  • ValueResolverAttribute

Each corresponds to the same fluent configuration mapping option.