Mapster
Mapster copied to clipboard
Issue: Inconsistent result for Select and IEnumrable with polymorphism
Assume with the following data structure:
public class BaseClass
{
private readonly string[] parameters1;
public BaseClass(string[] parameters1)
{
this.parameters1 = parameters1;
}
public IReadOnlyCollection<string> Parameters1 => this.parameters1;
}
public class DerivedClass : BaseClass
{
private readonly string[] parameters2;
public DerivedClass(string[] parameters1, string[] parameters2)
: base(parameters1)
{
this.parameters2 = parameters2;
}
public IReadOnlyCollection<string> Parameters2 => this.parameters2;
}
public class BaseClassDto
{
public BaseClassDto(IEnumerable<string> parameters1)
{
this.Parameters1 = parameters1.ToList().AsReadOnly();
}
public ReadOnlyCollection<string> Parameters1 { get; }
}
public class DerivedClassDto : BaseClassDto
{
public DerivedClassDto(IEnumerable<string> parameters1, IEnumerable<string> parameters2)
: base(parameters1)
{
this.Parameters2 = parameters2.ToList().AsReadOnly();
}
public ReadOnlyCollection<string> Parameters2 { get; }
}
Test codes:
public void Test()
{
TypeAdapterConfig<BaseClass, BaseClassDto>.NewConfig()
.Include<DerivedClass, DerivedClassDto>();
TypeAdapterConfig<BaseClass, BaseClassDto>.NewConfig()
.MapWith(src =>
new BaseClassDto(src.Parameters1.ToList()));
TypeAdapterConfig<DerivedClass, BaseClassDto>.NewConfig()
.Include<DerivedClass, DerivedClassDto>()
.MapWith(src =>
new DerivedClassDto(src.Parameters1.ToList(), src.Parameters2.ToList()));
List<BaseClass> baseClasses = new List<BaseClass>
{
new DerivedClass(new string[] { "123" }, new string[] { "123" }),
new BaseClass(new string[] { "123" })
};
var baseClassDtos = baseClasses.Select(bc => bc.Adapt<BaseClassDto>()).ToList();
Console.WriteLine(JsonConvert.SerializeObject(baseClassDtos));
baseClassDtos = baseClasses.Adapt<List<BaseClassDto>>();
Console.WriteLine(JsonConvert.SerializeObject(baseClassDtos));
}
Result:
[{"Parameters2":["123"],"Parameters1":["123"]},{"Parameters1":["123"]}]
[{"Parameters1":["123"]},{"Parameters1":["123"]}]