diff --git a/src/Mapster.Tests/WhenIgnoreMapping.cs b/src/Mapster.Tests/WhenIgnoreMapping.cs index 9bed5dc3..107405df 100644 --- a/src/Mapster.Tests/WhenIgnoreMapping.cs +++ b/src/Mapster.Tests/WhenIgnoreMapping.cs @@ -111,8 +111,78 @@ public void MappingToIntefaceWithIgnorePrivateSetProperty() } + /// + /// https://github.com/MapsterMapper/Mapster/issues/953 + /// + [TestMethod] + public void RemoveIgnoredFeatureIsWorked() + { + TypeAdapterConfig + .NewConfig() + .Map(dest => dest.PocoName, src => src.DtoName) + .Ignore(x=>x.PocoName); + + TypeAdapterConfig + .NewConfig() + .Inherits(); + + var srcDerived = new DerivedPoco953 { PocoName = "Alice" }; + + // standart cases + var resultDerived = srcDerived.Adapt(); + + // when igrored member is remove + + var resultDerivedRemoveAllIgnored = srcDerived + .Adapt(cfg => + { + cfg + .NewConfig() + .Inherits() + .IgnoredClear(); + }); + + var resultDerivedRemove = srcDerived + .Adapt(cfg => + { + cfg + .NewConfig() + .Inherits() + .IgnoredRemove(x=>x.PocoName); + }); + + var resultDerivedRemoveByName = srcDerived + .Adapt(cfg => + { + cfg + .NewConfig() + .Inherits() + .IgnoredRemove("PocoName"); + }); + + + resultDerived.PocoName.ShouldNotBeNullOrEmpty(); + resultDerivedRemoveAllIgnored.PocoName.ShouldBe("Alice"); + resultDerivedRemove.PocoName.ShouldBe("Alice"); + resultDerivedRemoveByName.PocoName.ShouldBe("Alice"); + + } + #region TestClasses + public class BaseDTO953 + { + public string DtoName { get; set; } + } + public class DerivedDTO953: BaseDTO953 { } + + public class BasePoco953 + { + public string PocoName { get; set; } + } + + public class DerivedPoco953 : BasePoco953 { } + public interface InterfaceDestination723 { public string Inter { get; set; } diff --git a/src/Mapster/TypeAdapterSetter.cs b/src/Mapster/TypeAdapterSetter.cs index 5dd0df11..b50933de 100644 --- a/src/Mapster/TypeAdapterSetter.cs +++ b/src/Mapster/TypeAdapterSetter.cs @@ -73,6 +73,25 @@ public static TSetter IgnoreAttribute(this TSetter setter, params Type[ return setter; } + public static TSetter IgnoredClear(this TSetter setter) where TSetter : TypeAdapterSetter + { + setter.CheckCompiled(); + setter.Settings.Ignore.Clear(); + + return setter; + } + + public static TSetter IgnoredRemove(this TSetter setter, params string[] names) where TSetter : TypeAdapterSetter + { + setter.CheckCompiled(); + + foreach (var name in names) + { + setter.Settings.Ignore.TryRemove(name, out _); + } + return setter; + } + public static TSetter IncludeAttribute(this TSetter setter, params Type[] types) where TSetter : TypeAdapterSetter { setter.CheckCompiled(); @@ -554,6 +573,16 @@ internal TypeAdapterSetter(TypeAdapterSettings settings, TypeAdapterConfig paren return (TypeAdapterSetter)base.Ignore(members); } + public TypeAdapterSetter IgnoredRemove(params Expression>[] members) + { + this.CheckCompiled(); + + foreach (var member in members) + { + Settings.Ignore.TryRemove(member.GetMemberPath()!, out _); + } + return this; + } public new TypeAdapterSetter Map( Expression> member, Expression> source)