-
Notifications
You must be signed in to change notification settings - Fork 392
Open
Description
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
Labels
No labels