MapsterMapper / Mapster

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

Mapster.Tool: Destination transform is not correctly handled when UseDestinationValue is used #599

Closed rafalka closed 1 year ago

rafalka commented 1 year ago

Mapster.Tool does not properly handle situation when both UseDestinationValue() and AddDestinationTransform() is used and generates coalesce (??) on void collection copy method.

Example: Declaration:

public class Src
{
    public IList<string> ListWithGetOnly { get; } = new List<string>();
}

public class Dst
{
    public List<string> ListWithGetOnly { get; } = new List<string>();
}

Mapper configuration:

            config.Default
                .UseDestinationValue(member => member.SetterModifier == AccessModifier.None &&
                                               member.Type.IsGenericType &&
                                               IsAssignableToGeneric(member.Type, typeof(ICollection<>)))
                .AddDestinationTransform(DestinationTransform.EmptyCollectionIfNull);

            config.ForType<Src, Dst>()
                .GenerateMapper(MapType.Map);

What gets generated:

      public static MapLib.MapTest.Dst AdaptToDst(this MapLib.MapTest.Src p1)
        {
            if (p1 == null)
            {
                return null;
            }
            MapLib.MapTest.Dst result = new MapLib.MapTest.Dst();

            funcMain1(p1.ListWithGetOnly, result.ListWithGetOnly) ?? new System.Collections.Generic.List<string>();
            return result;
        }

        private static System.Collections.Generic.List<string> funcMain1(System.Collections.Generic.IList<string> p2, System.Collections.Generic.List<string> p3)
        {
              ...
       }

Sample project: MapsterBug-DestinationTransform.zip