Skip to content

Regression bug - works on 7.3.0 not on 7.4.0 #672

@FaustoNascimento

Description

@FaustoNascimento

I found some pretty weird behaviour with Mapster 7.4.0...

Imagine you have the following DTOs:

public class Source
{
    public long Id { get; init; }
}

public class ADestination
{
    public int Id { get; init; }
}

public class BDestination : ADestination
{
    public new long Id { get; init; }
}

With no configuration at all, Mapster should be able to map between these two types and it can... but only depending on how it's invoked:

var source = new Source();
source.Adapt<BDestination>(); // this works
source.Adapt(new BDestination()); // this throws a AmbiguousMatchException exception

To make things worse ... if your DTOs are not as simple as this example and you use DI/IoC and you combine this with TypeAdapterConfig<Source, BDestination>.NewConfig().ConstructUsing() then the results are again unexpected depending on the Expression passed:

using Microsoft.Extensions.DependencyInjection;

var serviceProvider = new ServiceCollection().AddTransient<BDestination>().BuildServiceProvider();

// Obviously use *one* of the configurations below only

// Works if configured this way (only when doing Adapt<BDestination>() though!!)
TypeAdapterConfig<Source, BDestination>.NewConfig().ConstructUsing(_ => new BDestination());

// Does not work with this configuration - no matter what I try
TypeAdapterConfig<Source, BDestination>.NewConfig().ConstructUsing(_ => serviceProvider.GetRequiredService<BDestination>());

var source = new Source();
source.Adapt<BDestination>(); // Depending on configuration used, either Mapster will map successfully or throw AmbiguousMatchException  here

Any ideas what's going on and any potential workarounds?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions