Skip to content

Commit ff7603d

Browse files
committed
try to cover all cases
1 parent 8552e2e commit ff7603d

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

src/AutoMapper/MemberMap.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,20 @@ public class MemberMap
3939
public virtual ValueResolverConfiguration ValueResolverConfig { get => default; set { } }
4040
public virtual ValueResolverConfiguration ValueConverterConfig { get => default; set { } }
4141
public virtual IReadOnlyCollection<ValueTransformerConfiguration> ValueTransformers => Array.Empty<ValueTransformerConfiguration>();
42-
public MemberInfo SourceMember => CustomMapExpression.GetMember() ?? SourceMembers.FirstOrDefault();
43-
public string GetSourceMemberName() =>
44-
ValueConverterConfig?.GetSourceMemberName() ?? ValueResolverConfig?.GetSourceMemberName() ?? SourceMember?.Name;
42+
public MemberInfo SourceMember => this switch
43+
{
44+
{ ValueConverterConfig: ValueResolverConfiguration converter } => converter switch
45+
{
46+
{ SourceMember: LambdaExpression sourceExpression } => sourceExpression.GetMember(),
47+
{ SourceMemberName: { } } => null,
48+
_ => SourceMembers.Length == 1 ? SourceMembers[0] : null
49+
},
50+
{ ValueResolverConfig: ValueResolverConfiguration resolver } => resolver.SourceMember?.GetMember(),
51+
{ CustomMapFunction: { } } => null,
52+
{ CustomMapExpression: LambdaExpression mapFrom } => mapFrom.GetMember(),
53+
_ => SourceMembers.FirstOrDefault(),
54+
};
55+
public string GetSourceMemberName() => (ValueConverterConfig ?? ValueResolverConfig)?.SourceMemberName ?? SourceMember?.Name;
4556
public bool MustUseDestination => UseDestinationValue is true || !CanBeSet;
4657
public void MapFrom(LambdaExpression sourceMember)
4758
{
@@ -94,7 +105,6 @@ public ValueResolverConfiguration(object instance, Type interfaceType)
94105
InterfaceType = interfaceType;
95106
}
96107
public Type ResolvedType => InterfaceType.GenericTypeArguments.Last();
97-
public string GetSourceMemberName() => SourceMember == null ? SourceMemberName : SourceMember.GetMember()?.Name;
98108
}
99109
public readonly struct ValueTransformerConfiguration
100110
{

src/UnitTests/ConfigurationValidation.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,23 @@ class Destination
348348
public void Should_be_ignored() => new Action(AssertConfigurationIsValid)
349349
.ShouldThrow<AutoMapperConfigurationException>().Errors[0].UnmappedPropertyNames[0].ShouldBe(nameof(Source.Value));
350350
}
351+
352+
public class MatchingNonMemberExpressionWithSourceValidation : NonValidatingSpecBase
353+
{
354+
class Source
355+
{
356+
public string Value { get; set; }
357+
}
358+
class Destination
359+
{
360+
public string Value { get; set; }
361+
}
362+
protected override MapperConfiguration CreateConfiguration() => new(c => c.CreateMap<Source, Destination>(MemberList.Source)
363+
.ForMember(d => d.Value, o => o.MapFrom(s => s.Value ?? "")));
364+
[Fact]
365+
public void Should_be_ignored() => new Action(AssertConfigurationIsValid)
366+
.ShouldThrow<AutoMapperConfigurationException>().Errors[0].UnmappedPropertyNames[0].ShouldBe(nameof(Source.Value));
367+
}
351368

352369
public class When_testing_a_dto_with_fully_mapped_and_custom_matchers : AutoMapperSpecBase
353370
{

0 commit comments

Comments
 (0)