diff --git a/src/Mapster.Tests/WhenMappingWithExplicitInheritance.cs b/src/Mapster.Tests/WhenMappingWithExplicitInheritance.cs index 442ed7e1..d71f9af1 100644 --- a/src/Mapster.Tests/WhenMappingWithExplicitInheritance.cs +++ b/src/Mapster.Tests/WhenMappingWithExplicitInheritance.cs @@ -96,6 +96,30 @@ public void Ignores_Are_Derived_From_Base_Configurations() dto.Name.ShouldBeNull(); } + [TestMethod] + public void Child_Explicit_Map_Overrides_Base_Ignore() + { + TypeAdapterConfig.NewConfig() + .Ignore(dest => dest.Name) + .Compile(); + + TypeAdapterConfig.NewConfig() + .Inherits() + .Map(dest => dest.Name, src => src.Name) + .Compile(); + + var source = new DerivedPoco + { + Id = new Guid(), + Name = "SourceName" + }; + + var dto = TypeAdapter.Adapt(source); + + dto.Id.ShouldBe(source.Id); + dto.Name.ShouldBe(source.Name); + } + [TestMethod] public void Derived_Config_Shares_Base_Config_Properties() { diff --git a/src/Mapster/TypeAdapterSetter.cs b/src/Mapster/TypeAdapterSetter.cs index b50933de..293bdf1d 100644 --- a/src/Mapster/TypeAdapterSetter.cs +++ b/src/Mapster/TypeAdapterSetter.cs @@ -31,6 +31,12 @@ internal static void CheckCompiled(this TSetter setter) where TSetter : throw new InvalidOperationException("TypeAdapter.Adapt was already called, please clone or create new TypeAdapterConfig."); } + internal static void AddMemberResolver(this TSetter setter, InvokerModel resolver) where TSetter : TypeAdapterSetter + { + setter.Settings.Resolvers.Add(resolver); + setter.Settings.Ignore.TryRemove(resolver.DestinationMemberName, out _); + } + public static TSetter AddDestinationTransform(this TSetter setter, Expression> transform) where TSetter : TypeAdapterSetter { setter.CheckCompiled(); @@ -174,7 +180,7 @@ public static TSetter Map( setter.CheckCompiled(); var invoker = Expression.Lambda(source.Body, Expression.Parameter(typeof(object))); - setter.Settings.Resolvers.Add(new InvokerModel + setter.AddMemberResolver(new InvokerModel { DestinationMemberName = memberName, Invoker = invoker, @@ -190,7 +196,7 @@ public static TSetter Map( { setter.CheckCompiled(); - setter.Settings.Resolvers.Add(new InvokerModel + setter.AddMemberResolver(new InvokerModel { DestinationMemberName = memberName, SourceMemberName = source.GetMemberPath(noError: true), @@ -206,7 +212,7 @@ public static TSetter Map( { setter.CheckCompiled(); - setter.Settings.Resolvers.Add(new InvokerModel + setter.AddMemberResolver(new InvokerModel { DestinationMemberName = destinationMemberName, SourceMemberName = sourceMemberName, @@ -426,7 +432,7 @@ public TypeAdapterSetter Map( return this; } - Settings.Resolvers.Add(new InvokerModel + this.AddMemberResolver(new InvokerModel { DestinationMemberName = member.GetMemberPath()!, Invoker = invoker, @@ -447,7 +453,7 @@ public TypeAdapterSetter Map( return this; } - Settings.Resolvers.Add(new InvokerModel + this.AddMemberResolver(new InvokerModel { DestinationMemberName = destinationMember.GetMemberPath()!, SourceMemberName = sourceMemberName, @@ -669,7 +675,7 @@ public TypeAdapterSetter Map Map( { this.CheckCompiled(); - Settings.Resolvers.Add(new InvokerModel + this.AddMemberResolver(new InvokerModel { DestinationMemberName = memberName, SourceMemberName = source.GetMemberPath(noError: true),