Mapster icon indicating copy to clipboard operation
Mapster copied to clipboard

mapster tool generates non-public interface method/property implementation

Open zaigr opened this issue 3 years ago • 1 comments

When generating mapper from interface containing mapping method/property with internal classes mapster tool generates internal implementation of this method/property

  • Mapster.Core v1.2.0
  • mapster.tool v8.2.1
  • executed on net5
[Mapper(IsInternal = true)]
internal interface IMyMappers
{
    PocoDto Map(Poco source);

    Expression<Func<Poco, PocoDto>> ProjectToDto { get; }
}

public record Poco(string Name, string Description);

internal record PocoDto(string Name, string Description);

Generated mapper class is:

internal partial class MyMappers : IMyMappers
{
    internal Expression<Func<Poco, PocoDto>> ProjectToDto => p1 => new PocoDto(p1.Name, p1.Description);
    internal PocoDto Map(Poco p2)
    {
        return p2 == null ? null : new PocoDto(p2.Name, p2.Description);
    }
}

CS0737: 'MyMappers.Map(Poco)' cannot implement an interface member because it is not public. CS0737: 'MyMappers.ProjectToDto' cannot implement an interface member because it is not public.

Maybe internal class with proper implementations should be generated even in case MapperAttribute.IsInternal hasn't been specified

zaigr avatar Jan 05 '22 10:01 zaigr

@zaigr After looking at the code I suspect that this is a shortcoming in the ExpressionTranslator library. It seems like it would be an easy fix though (take a look at line 1179-1181 and 1210-1212).

andrerav avatar Feb 20 '22 20:02 andrerav