MapsterMapper / Mapster

A fast, fun and stimulating object to object Mapper
MIT License
4.23k stars 325 forks source link

Incorrect mapping of array member #710

Closed li-zheng-hao closed 1 month ago

li-zheng-hao commented 1 month ago

Environment

Unit Test Case

[Fact]
public void Test()
{
    var source=new ADto()
    {
        F1 = "F1_source",
        B =
        [
            new BDto()
            {
                F2 = "F2_source",
            }
        ]
    };
    var target=new A()
    {
        F1 = "F1_target",
        B =
        [
            new()
            {
                F2 = "F2_target",
                F3 = "F3_target"
            }
        ]
    };

    source.Adapt(target);

    Assert.Equal("F3_target",target.B.First().F3);

}

internal class A
{
    public string F1 { get; set; }

    public List<B> B { get; set; }
}

internal class B
{
    public string F2 { get; set; }
    public string F3 { get; set; }
}

internal class ADto
{
    public string F1 { get; set; }

    public List<BDto> B { get; set; }
}
internal class BDto
{
    public string F2 { get; set; }
}

Assert.Equal("F3_target",target.B.First().F3); should be passed, but now it fails

li-zheng-hao commented 1 month ago
[Fact]
public void IgnoreNotExistPropertyPassed()
{
    var source=new BDto()
    {
        F2 = "F2_source",
    };
    var target =
        new B()
        {
            F2 = "F2_target",
            F3 = "F3_target"
        };

    source.Adapt(target);

    // passed
    Assert.Equal("F3_target",target.F3);
}

here is a passed test case.

li-zheng-hao commented 1 month ago

After looking at the source code, I think I know why this happened

https://github.com/MapsterMapper/Mapster/blob/04ac871b55828c3909b6cee4764e6fab40db3983/src/Mapster/Adapters/CollectionAdapter.cs#L104-L111