Skip to content

Commit 2b99e96

Browse files
committed
MapFrom should override ignore
1 parent e7ba023 commit 2b99e96

File tree

6 files changed

+33
-26
lines changed

6 files changed

+33
-26
lines changed

src/AutoMapper/Configuration/CtorParamConfigurationExpression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ public CtorParamConfigurationExpression(string ctorParamName, Type sourceType)
4545
}
4646

4747
public void MapFrom<TMember>(Expression<Func<TSource, TMember>> sourceMember) =>
48-
_ctorParamActions.Add(cpm => cpm.SetResolver(sourceMember));
48+
_ctorParamActions.Add(cpm => cpm.MapFrom(sourceMember));
4949

5050
public void MapFrom<TMember>(Func<TSource, ResolutionContext, TMember> resolver)
5151
{
5252
Expression<Func<TSource, TDestination, TMember, ResolutionContext, TMember>> resolverExpression = (src, dest, destMember, ctxt) => resolver(src, ctxt);
53-
_ctorParamActions.Add(cpm => cpm.Resolver = new FuncResolver(resolverExpression));
53+
_ctorParamActions.Add(cpm => cpm.SetResolver(new FuncResolver(resolverExpression)));
5454
}
5555

5656
public void MapFrom(string sourceMembersPath)

src/AutoMapper/Configuration/MemberConfigurationExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public MemberConfigurationExpression(MemberInfo destinationMember, Type sourceTy
2424
public void MapFrom<TValueResolver>() where TValueResolver : IValueResolver<TSource, TDestination, TMember> =>
2525
MapFromCore(new(typeof(TValueResolver), typeof(IValueResolver<TSource, TDestination, TMember>)));
2626
protected void MapFromCore(ClassValueResolver config) => SetResolver(config);
27-
protected void SetResolver(IValueResolver config) => PropertyMapActions.Add(pm => pm.Resolver = config);
27+
protected void SetResolver(IValueResolver config) => PropertyMapActions.Add(pm => pm.SetResolver(config));
2828
public void MapFrom<TValueResolver, TSourceMember>(Expression<Func<TSource, TSourceMember>> sourceMember)
2929
where TValueResolver : IMemberValueResolver<TSource, TDestination, TSourceMember, TMember> =>
3030
MapFromCore<TValueResolver, TSourceMember>(sourceMember);

src/AutoMapper/Configuration/TypeMapConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ private void ReverseSourceMembers(MemberPath memberPath, LambdaExpression custom
185185

186186
var pathMap = reverseTypeMap.FindOrCreatePathMapFor(forPathLambda, memberPath, reverseTypeMap);
187187

188-
pathMap.SetResolver(customExpression);
188+
pathMap.MapFrom(customExpression);
189189
});
190190
}
191191
protected void ForSourceMemberCore(string sourceMemberName, Action<ISourceMemberConfigurationExpression> memberOptions)

src/AutoMapper/MemberMap.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ public class MemberMap : IValueResolver
1010
public TypeMap TypeMap { get; protected set; }
1111
public LambdaExpression CustomMapExpression => Resolver?.ProjectToExpression;
1212
public bool IsResolveConfigured => Resolver != null && Resolver != this;
13-
public void SetResolver(LambdaExpression lambda) => Resolver = new ExpressionResolver(lambda);
13+
public void MapFrom(LambdaExpression lambda) => SetResolver(new ExpressionResolver(lambda));
14+
public void SetResolver(IValueResolver resolver)
15+
{
16+
Resolver = resolver;
17+
Ignored = false;
18+
}
1419
public virtual Type SourceType => default;
1520
public virtual MemberInfo[] SourceMembers { get => Array.Empty<MemberInfo>(); set { } }
1621
public virtual IncludedMember IncludedMember => null;
@@ -27,22 +32,17 @@ public class MemberMap : IValueResolver
2732
public virtual object NullSubstitute { get => default; set { } }
2833
public virtual LambdaExpression PreCondition { get => default; set { } }
2934
public virtual LambdaExpression Condition { get => default; set { } }
30-
public IValueResolver Resolver { get; set; }
35+
public IValueResolver Resolver { get; protected set; }
3136
public virtual IReadOnlyCollection<ValueTransformerConfiguration> ValueTransformers => Array.Empty<ValueTransformerConfiguration>();
3237
public MemberInfo SourceMember => Resolver?.GetSourceMember(this);
3338
public string GetSourceMemberName() => Resolver?.SourceMemberName ?? SourceMember?.Name;
3439
public bool MustUseDestination => UseDestinationValue is true || !CanBeSet;
35-
public void MapFrom(LambdaExpression sourceMember)
36-
{
37-
SetResolver(sourceMember);
38-
Ignored = false;
39-
}
4040
public void MapFrom(string sourceMembersPath, MemberInfo[] members)
4141
{
4242
var sourceType = TypeMap.SourceType;
4343
var sourceMembers = sourceType.ContainsGenericParameters ? members :
4444
members[0].DeclaringType.ContainsGenericParameters ? ReflectionHelper.GetMemberPath(sourceType, sourceMembersPath, TypeMap) : members;
45-
Resolver = new MemberPathResolver(sourceMembers);
45+
SetResolver(new MemberPathResolver(sourceMembers));
4646
}
4747
public override string ToString() => DestinationName;
4848
public Expression ChainSourceMembers(Expression source) => SourceMembers.Chain(source);

src/AutoMapper/QueryableExtensions/ProjectionBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ void ReplaceSubQueries()
245245
{
246246
var letProperty = letType.GetProperty(letMapInfo.Property.Name);
247247
var letPropertyMap = letTypeMap.FindOrCreatePropertyMapFor(letProperty, letMapInfo.Property.Type);
248-
letPropertyMap.SetResolver(Lambda(letMapInfo.LetExpression.ReplaceParameters(letMapInfo.MapFromSource), secondParameter));
248+
letPropertyMap.MapFrom(Lambda(letMapInfo.LetExpression.ReplaceParameters(letMapInfo.MapFromSource), secondParameter));
249249
projection = projection.Replace(letMapInfo.Marker, Property(secondParameter, letProperty));
250250
}
251251
projection = new ReplaceMemberAccessesVisitor(instanceParameter, secondParameter).Visit(projection);
Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,45 @@
11
namespace AutoMapper.UnitTests.Bug;
2-
3-
public class OverrideIgnore
2+
public class OverrideIgnoreMapFromString
43
{
54
public class DomainBase
65
{
76
public string SomeProperty { get; set; }
87
}
9-
108
public class DtoBase
119
{
1210
public string SomeDifferentProperty { get; set; }
1311
}
14-
1512
[Fact]
1613
public void specifying_map_should_override_ignore()
1714
{
1815
var config = new MapperConfiguration(cfg => cfg.CreateMap<DomainBase, DtoBase>()
1916
.ForMember(m=>m.SomeDifferentProperty, m=>m.Ignore())
20-
.ForMember(m=>m.SomeDifferentProperty, m=>m.MapFrom(s=>s.SomeProperty)));
17+
.ForMember(m=>m.SomeDifferentProperty, m=>m.MapFrom("SomeProperty")));
2118

2219
var dto = config.CreateMapper().Map<DomainBase, DtoBase>(new DomainBase {SomeProperty = "Test"});
2320

24-
"Test".ShouldBe(dto.SomeDifferentProperty);
21+
dto.SomeDifferentProperty.ShouldBe("Test");
22+
}
23+
}
24+
public class OverrideIgnore
25+
{
26+
public class DomainBase
27+
{
28+
public string SomeProperty { get; set; }
29+
}
30+
public class DtoBase
31+
{
32+
public string SomeDifferentProperty { get; set; }
2533
}
26-
2734
[Fact]
28-
public void specifying_map_should_override_ignore_with_one_parameter()
35+
public void specifying_map_should_override_ignore()
2936
{
3037
var config = new MapperConfiguration(cfg => cfg.CreateMap<DomainBase, DtoBase>()
31-
.ForMember(m => m.SomeDifferentProperty, m => m.Ignore())
32-
.ForMember(m => m.SomeDifferentProperty, m => m.MapFrom(s => s.SomeProperty)));
38+
.ForMember(m=>m.SomeDifferentProperty, m=>m.Ignore())
39+
.ForMember(m=>m.SomeDifferentProperty, m=>m.MapFrom(s=>s.SomeProperty)));
3340

34-
var dto = config.CreateMapper().Map<DtoBase>(new DomainBase { SomeProperty = "Test" });
41+
var dto = config.CreateMapper().Map<DomainBase, DtoBase>(new DomainBase {SomeProperty = "Test"});
3542

36-
"Test".ShouldBe(dto.SomeDifferentProperty);
43+
dto.SomeDifferentProperty.ShouldBe("Test");
3744
}
38-
}
45+
}

0 commit comments

Comments
 (0)