Skip to content

Commit d87bfe0

Browse files
authored
enable opt-in to case-insensitive mapping of enum values (#9)
* enable opt-in to case-insensitive mapping of enum values #7 * adopt changes after review by @HenkKin ([email protected])
1 parent 0cf3a01 commit d87bfe0

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

src/AutoMapper.Extensions.EnumMapping.Tests/EnumValueMappingByName.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,33 @@ public void Should_map_enum_by_name()
3333
}
3434
}
3535

36+
public class ValidIgnoreCase : AutoMapperSpecBase
37+
{
38+
Destination _result;
39+
public enum Source { Default, FOO, Bar, FooBar }
40+
public enum Destination { fOObAR, DefaulT, Bar, Foo }
41+
42+
protected override MapperConfiguration Configuration { get; } = new MapperConfiguration(cfg =>
43+
{
44+
cfg.EnableEnumMappingValidation();
45+
cfg.CreateMap<Source, Destination>()
46+
.ConvertUsingEnumMapping(opt => opt.MapByName(true));
47+
});
48+
49+
protected override void Because_of()
50+
{
51+
_result = Mapper.Map<Source, Destination>(Source.FooBar);
52+
}
53+
54+
[Fact]
55+
public void Should_map_enum_by_name()
56+
{
57+
_result.ShouldBe(Destination.fOObAR);
58+
((int)_result).ShouldNotBe((int)Source.FooBar);
59+
}
60+
61+
}
62+
3663
public class ValidCustomMapping : AutoMapperSpecBase
3764
{
3865
Destination _result;

src/AutoMapper.Extensions.EnumMapping/IEnumConfigurationExpression.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ public interface IEnumConfigurationExpression<in TSource, in TDestination>
1414
/// <summary>
1515
/// Map enum values by name
1616
/// </summary>
17+
/// <param name="ignoreCase">Optional, ignore casing for enum value names</param>
1718
/// <returns>Enum configuration options</returns>
18-
IEnumConfigurationExpression<TSource, TDestination> MapByName();
19+
IEnumConfigurationExpression<TSource, TDestination> MapByName(bool ignoreCase = false);
1920

2021
/// <summary>
2122
/// (default) Map enum values by value (underlying value type)

src/AutoMapper.Extensions.EnumMapping/Internal/EnumMappingFeature.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ internal class EnumMappingFeature<TSource, TDestination> : IMappingFeature, IEnu
1010
where TDestination : struct, Enum
1111
{
1212
protected EnumMappingType EnumMappingType = EnumMappingType.Value;
13+
protected bool IgnoreCase;
14+
1315
protected readonly Dictionary<TSource, TDestination> EnumValueMappingsOverride = new Dictionary<TSource, TDestination>();
1416

1517
public void Configure(TypeMap typeMap)
@@ -50,15 +52,13 @@ private Dictionary<TSource, TDestination> CreateDefaultEnumValueMappings(Type so
5052

5153
if (EnumMappingType == EnumMappingType.Name)
5254
{
53-
const bool ignoreCase = false;
54-
5555
foreach (TDestination destinationEnumValue in destinationEnumValues)
5656
{
5757
var destinationEnumName = Enum.GetName(destinationType, destinationEnumValue);
5858

5959
if (!string.IsNullOrWhiteSpace(destinationEnumName))
6060
{
61-
if (Enum.TryParse(destinationEnumName, ignoreCase, out TSource sourceEnumValue))
61+
if (Enum.TryParse(destinationEnumName, IgnoreCase, out TSource sourceEnumValue))
6262
{
6363
enumValueMappings.Add(sourceEnumValue, destinationEnumValue);
6464
}
@@ -89,9 +89,10 @@ private Dictionary<TSource, TDestination> CreateDefaultEnumValueMappings(Type so
8989
return enumValueMappings;
9090
}
9191

92-
public IEnumConfigurationExpression<TSource, TDestination> MapByName()
92+
public IEnumConfigurationExpression<TSource, TDestination> MapByName(bool ignoreCase = false)
9393
{
9494
EnumMappingType = EnumMappingType.Name;
95+
IgnoreCase = ignoreCase;
9596
return this;
9697
}
9798

@@ -113,7 +114,7 @@ public IMappingFeature Reverse()
113114

114115
if (EnumMappingType == EnumMappingType.Name)
115116
{
116-
reverseEnumConfigurationExpression.MapByName();
117+
reverseEnumConfigurationExpression.MapByName(IgnoreCase);
117118
}
118119
else
119120
{

0 commit comments

Comments
 (0)