diff --git a/src/AutoMapper/Mappers/ConversionOperatorMapper.cs b/src/AutoMapper/Mappers/ConversionOperatorMapper.cs index c1a2d15c3d..1729895a5d 100644 --- a/src/AutoMapper/Mappers/ConversionOperatorMapper.cs +++ b/src/AutoMapper/Mappers/ConversionOperatorMapper.cs @@ -11,7 +11,7 @@ public class ConversionOperatorMapper : IObjectMapper public bool IsMatch(TypePair context) => GetConversionOperator(context.SourceType, context.DestinationType) != null; private MethodInfo GetConversionOperator(Type sourceType, Type destinationType) { - foreach (MethodInfo sourceMethod in sourceType.GetMember(_operatorName, MemberTypes.Method, TypeExtensions.StaticFlags)) + foreach (MethodInfo sourceMethod in sourceType.GetMember(_operatorName, MemberTypes.Method, BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy)) { if (destinationType.IsAssignableFrom(sourceMethod.ReturnType)) { @@ -26,4 +26,4 @@ public Expression MapExpression(IGlobalConfiguration configurationProvider, Prof return Expression.Call(conversionOperator, ToType(sourceExpression, conversionOperator.GetParameters()[0].ParameterType)); } } -} \ No newline at end of file +} diff --git a/src/UnitTests/Mappers/ConversionOperators.cs b/src/UnitTests/Mappers/ConversionOperators.cs index bae9b9d755..6a81634b4b 100644 --- a/src/UnitTests/Mappers/ConversionOperators.cs +++ b/src/UnitTests/Mappers/ConversionOperators.cs @@ -82,6 +82,9 @@ public static implicit operator string(Foo other) } + public class InheritedFoo : Foo + { } + public class Bar { public string OtherValue { get; set; } @@ -97,6 +100,17 @@ public void Should_use_the_implicit_conversion_operator() _bar.OtherValue.ShouldBe("Hello"); } + + [Fact] + public void Should_use_the_inherited_implicit_conversion_operator() + { + var source = new InheritedFoo { Value = "Hello" }; + + var config = new MapperConfiguration(cfg => { }); + _bar = config.CreateMapper().Map(source); + + _bar.OtherValue.ShouldBe("Hello"); + } } public class When_mapping_to_classes_with_explicit_conversion_operator_on_the_destination @@ -147,6 +161,9 @@ public static explicit operator Bar(Foo other) } } + public class InheritedFoo : Foo + { } + public class Bar { public string OtherValue { get; set; } @@ -159,5 +176,16 @@ public void Should_use_the_explicit_conversion_operator() _bar = config.CreateMapper().Map(new Foo { Value = "Hello" }); _bar.OtherValue.ShouldBe("Hello"); } + + [Fact] + public void Should_use_the_inherited_explicit_conversion_operator() + { + var source = new InheritedFoo { Value = "Hello" }; + + var config = new MapperConfiguration(cfg => { }); + _bar = config.CreateMapper().Map(source); + + _bar.OtherValue.ShouldBe("Hello"); + } } -} \ No newline at end of file +}