Skip to main content

Enum mappings

An enum mapping can be customized by setting the strategy to use. Apply the MapEnumAttribute and pass the strategy to be used for this enum. It is also possible to set the strategy for the entire mapper via the MapperAttribute. Available strategies:

NameDescription
ByValueMatches enum entries by their values (default)
ByValueCheckDefinedMatches enum entries by their values, checks if the target value is defined
ByNameMatches enum entries by their exact names

The IgnoreCase property allows to opt in for case insensitive mappings (defaults to false).

Applied to all enums mapped inside this mapper.

[Mapper(EnumMappingStrategy = EnumMappingStrategy.ByName, EnumMappingIgnoreCase = true)]
public partial class CarMapper
{
...
}

Enum from/to string naming strategies

Enum from/to strings mappings can be customized by setting the enum naming strategy to be used. You can specify the naming strategy using NamingStrategy in MapEnumAttribute or EnumNamingStrategy in MapperAttribute and MapperDefaultsAttribute. Available naming strategies:

NameDescription
MemberNameMatches enum values using their name. (default)
CamelCaseMatches enum values using camelCase.
PascalCaseMatches enum values using PascalCase.
SnakeCaseMatches enum values using snake_case.
UpperSnakeCaseMatches enum values using UPPER_SNAKE_CASE.
KebabCaseMatches enum values using kebab-case.
UpperKebabCaseMatches enum values using UPPER-KEBAB-CASE.
ComponentModelDescriptionAttributeMatches enum values using the Description property of the System.ComponentModel.DescriptionAttribute. If the attribute is not present or the property is null, the member name is used.
SerializationEnumMemberAttributeMatches enum values using the Value property of the System.Runtime.Serialization.EnumMemberAttribute. If the attribute is not present or the property is null, the member name is used.

Note that explicit enum mappings (MapEnumValue) and fallback values (FallbackValue in MapEnum) are not affected by naming strategies.

Applied to all enums mapped inside this mapper.

[Mapper(EnumNamingStrategy = EnumNamingStrategy.SnakeCase)]
public partial class CarMapper
{
...
}

Manually mapped enum values

To explicitly map enum values the MapEnumValueAttibute can be used. Attribute is only valid on enum-to-enum, enum-to-string and string-to-enum mappings.

Explicit enum mappings are not affected by enum naming strategies.

[Mapper]
public partial class CarMapper
{
[MapEnum(EnumMappingStrategy.ByName)]
[MapEnumValue(CarFeature.AWD, CarFeatureDto.AllWheelDrive)]
public partial CarFeatureDto MapFeature(CarFeature feature);

[MapEnumValue("AWD", CarFeatureDto.AllWheelDrive)]
public partial CarFeatureDto MapFeatureFromString(string feature);

[MapEnumValue(CarFeatureDto.AllWheelDrive, "AWD")]
public partial string MapFeatureToString(CarFeatureDto feature);
}

Ignore enum values

To ignore an enum value the MapperIgnoreSourceValue or MapperIgnoreTargetValue attributes can be used. This is especially useful when applying strict enum mappings.

[Mapper]
public partial class FruitMapper
{
[MapperIgnoreSourceValue(Fruit.Apple)]
[MapperIgnoreTargetValue(FruitDto.Pineapple)]
public partial FruitDto Map(Fruit source);
}

Fallback value

To map to a fallback value instead of throwing when encountering an unknown value, the FallbackValue property on the MapEnum attribute can be used.

FallbackValue is supported by ByName and ByValueCheckDefined. FallbackValue is not affected by enum naming strategies.

[Mapper]
public partial class CarMapper
{
[MapEnum(EnumMappingStrategy.ByName, FallbackValue = CarFeatureDto.Unknown)]
public partial CarFeatureDto MapFeature(CarFeature feature);
}

One side strict enum member mappings

By default Mapperly emits diagnostics with a severity of warning if there are unmapped source or target enum members. To enforce strict enum member mappings on only either the source or the target, the RequiredMappingStrategy can be used.

Sets the RequiredMappingStrategy for all methods within the mapper, by default it is Both requiring all members to be mapped. This can be overriden by individual mapping methods using MapperRequiredMappingAttribute.

[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Source)]
public partial class CarMapper
{
...
}