Skip to content

Commit 6f9cf25

Browse files
authored
Fix EnableEnumMappingValidation with non-enum configurations (#19)
* Add failing EnumMappingValidation test * Add EnumMappingValidationRuntimeFeatureProxy to fix the bug
1 parent 22a6ff9 commit 6f9cf25

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using AutoMapper.Extensions.EnumMapping.Tests.Internal;
2+
3+
namespace AutoMapper.Extensions.EnumMapping.Tests;
4+
5+
public class EnumMappingValidation
6+
{
7+
public class Default : AutoMapperSpecBase
8+
{
9+
protected override MapperConfiguration Configuration { get; } = new(cfg =>
10+
{
11+
cfg.EnableEnumMappingValidation();
12+
cfg.CreateMap<object, object>();
13+
});
14+
}
15+
}

src/AutoMapper.Extensions.EnumMapping/EnumMapperConfigurationExpressionExtensions.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Linq;
2-
using AutoMapper.Extensions.EnumMapping.Internal;
1+
using AutoMapper.Extensions.EnumMapping.Internal;
32
using AutoMapper.Internal;
43

54
namespace AutoMapper.Extensions.EnumMapping
@@ -17,16 +16,9 @@ public static void EnableEnumMappingValidation(this IMapperConfigurationExpressi
1716
{
1817
mapperConfigurationExpression.Internal().Validator(context =>
1918
{
20-
if (context.TypeMap != null)
21-
{
22-
foreach (var feature in context.TypeMap.Features)
23-
{
24-
if (feature is IEnumMappingValidationRuntimeFeature validator)
25-
{
26-
validator.Validate(context.TypeMap.Types);
27-
}
28-
}
29-
}
19+
var validator = context.TypeMap?.Features.Get<EnumMappingValidationRuntimeFeatureProxy>();
20+
21+
validator?.Validate(context.TypeMap.Types);
3022
});
3123
}
3224
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ public void Configure(TypeMap typeMap)
3131

3232
var lambdaExpression = new CustomMapExpressionFactory<TSource, TDestination>(enumValueMappings).Create();
3333
typeMap.TypeConverter = new ExpressionTypeConverter(lambdaExpression);
34-
typeMap.Features.Set(new EnumMappingValidationRuntimeFeature<TSource, TDestination>(enumValueMappings, EnumMappingType));
34+
typeMap.Features.Set(new EnumMappingValidationRuntimeFeatureProxy(
35+
new EnumMappingValidationRuntimeFeature<TSource, TDestination>(enumValueMappings, EnumMappingType)
36+
));
3537
}
3638

3739
private Dictionary<TSource, TDestination> CreateOverridedEnumValueMappings(Type sourceType, Type destinationType)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using AutoMapper.Internal;
2+
3+
namespace AutoMapper.Extensions.EnumMapping.Internal;
4+
5+
internal class EnumMappingValidationRuntimeFeatureProxy : IEnumMappingValidationRuntimeFeature
6+
{
7+
private readonly IEnumMappingValidationRuntimeFeature _innerValidationRuntimeFeature;
8+
9+
public EnumMappingValidationRuntimeFeatureProxy(IEnumMappingValidationRuntimeFeature innerValidationRuntimeFeature)
10+
{
11+
_innerValidationRuntimeFeature = innerValidationRuntimeFeature;
12+
}
13+
14+
public void Seal(IGlobalConfiguration configurationProvider) => _innerValidationRuntimeFeature.Seal(configurationProvider);
15+
16+
public void Validate(TypePair typePair) => _innerValidationRuntimeFeature.Validate(typePair);
17+
}

0 commit comments

Comments
 (0)