Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/Mapster.Tests/WhenMappingWithExplicitInheritance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<SimplePoco, SimpleDto>.NewConfig()
.Ignore(dest => dest.Name)
.Compile();

TypeAdapterConfig<DerivedPoco, DerivedDto>.NewConfig()
.Inherits<SimplePoco, SimpleDto>()
.Map(dest => dest.Name, src => src.Name)
.Compile();

var source = new DerivedPoco
{
Id = new Guid(),
Name = "SourceName"
};

var dto = TypeAdapter.Adapt<DerivedDto>(source);

dto.Id.ShouldBe(source.Id);
dto.Name.ShouldBe(source.Name);
}

[TestMethod]
public void Derived_Config_Shares_Base_Config_Properties()
{
Expand Down
20 changes: 13 additions & 7 deletions src/Mapster/TypeAdapterSetter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ internal static void CheckCompiled<TSetter>(this TSetter setter) where TSetter :
throw new InvalidOperationException("TypeAdapter.Adapt was already called, please clone or create new TypeAdapterConfig.");
}

internal static void AddMemberResolver<TSetter>(this TSetter setter, InvokerModel resolver) where TSetter : TypeAdapterSetter
{
setter.Settings.Resolvers.Add(resolver);
setter.Settings.Ignore.TryRemove(resolver.DestinationMemberName, out _);
}

public static TSetter AddDestinationTransform<TSetter, TDestinationMember>(this TSetter setter, Expression<Func<TDestinationMember, TDestinationMember>> transform) where TSetter : TypeAdapterSetter
{
setter.CheckCompiled();
Expand Down Expand Up @@ -174,7 +180,7 @@ public static TSetter Map<TSetter, TSourceMember>(
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,
Expand All @@ -190,7 +196,7 @@ public static TSetter Map<TSetter, TSource, TSourceMember>(
{
setter.CheckCompiled();

setter.Settings.Resolvers.Add(new InvokerModel
setter.AddMemberResolver(new InvokerModel
{
DestinationMemberName = memberName,
SourceMemberName = source.GetMemberPath(noError: true),
Expand All @@ -206,7 +212,7 @@ public static TSetter Map<TSetter>(
{
setter.CheckCompiled();

setter.Settings.Resolvers.Add(new InvokerModel
setter.AddMemberResolver(new InvokerModel
{
DestinationMemberName = destinationMemberName,
SourceMemberName = sourceMemberName,
Expand Down Expand Up @@ -426,7 +432,7 @@ public TypeAdapterSetter<TDestination> Map<TDestinationMember, TSourceMember>(
return this;
}

Settings.Resolvers.Add(new InvokerModel
this.AddMemberResolver(new InvokerModel
{
DestinationMemberName = member.GetMemberPath()!,
Invoker = invoker,
Expand All @@ -447,7 +453,7 @@ public TypeAdapterSetter<TDestination> Map<TDestinationMember>(
return this;
}

Settings.Resolvers.Add(new InvokerModel
this.AddMemberResolver(new InvokerModel
{
DestinationMemberName = destinationMember.GetMemberPath()!,
SourceMemberName = sourceMemberName,
Expand Down Expand Up @@ -669,7 +675,7 @@ public TypeAdapterSetter<TSource, TDestination> Map<TDestinationMember, TSourceM
return this;
}

Settings.Resolvers.Add(new InvokerModel
this.AddMemberResolver(new InvokerModel
{
DestinationMemberName = member.GetMemberPath()!,
SourceMemberName = sourceName,
Expand All @@ -685,7 +691,7 @@ public TypeAdapterSetter<TSource, TDestination> Map<TSourceMember>(
{
this.CheckCompiled();

Settings.Resolvers.Add(new InvokerModel
this.AddMemberResolver(new InvokerModel
{
DestinationMemberName = memberName,
SourceMemberName = source.GetMemberPath(noError: true),
Expand Down