Странное поведение Automapper, когда тип свойства игнорируется - PullRequest
0 голосов
/ 20 февраля 2019

После того как я увидел , как игнорировать тип свойства с помощью Automapper , я попробовал его в тестовом проекте.Оказывается, свойство определенного типа игнорируется должным образом, но при вызове AssertConfigurationIsValid() выдается исключение, указывающее, что были найдены несопоставленные элементы.Я могу понять причину этого исключения, поскольку члены типа, которые должны игнорироваться, не отображаются, но меня интересует, должны ли эти исключения создаваться в контексте, где я специально удалил отображение.

Для данного кода:

class Type1
{
    public int Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}

class Type2
{
    public int Prop1 { get; set; }
    public string Prop2 { get; set; }
    public TypeToIgnore Prop3 { get; set; }
}

class MappingProfile : Profile
{
    public MappingProfile()
    {
        ShouldMapProperty = p => p.PropertyType != typeof(TypeToIgnore);
        CreateMap<Type2, Type1>();
    }
}

//...

var config = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile()));
config.AssertConfigurationIsValid(); //this throws AutoMapperConfigurationException

Не будет ли правильным поведение Automapper игнорировать элементы и не создавать исключение при проверке правильности конфигурации, как в случае игнорированиясобственно свойство?

CreateMap<Type2, Type1>().ForMember(x => x.Prop3, y => y.Ignore());

1 Ответ

0 голосов
/ 20 февраля 2019

AutoMapper карты от источника до места назначения.Насколько я знаю, по умолчанию поля, присутствующие в источнике, но отсутствующие в типе назначения, игнорируются.Вы должны явно обработать поля, отсутствующие в источнике, но присутствующие в типе назначения.В вашем случае TypeToIgnore находится в источнике.Таким образом, игнорируя этот тип, у вас не будет исходного аналога Prop3 в пункте назначения.

В качестве иллюстрации это не вызовет исключения:

ShouldMapProperty = p => p.PropertyType != typeof(TypeToIgnore);
CreateMap<Type1, Type2>();

Также не будет этого:

public class TypeToIgnore { }

void Main()
{

    var config = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile()));
    config.AssertConfigurationIsValid(); // won't throw
}

class Type1
{
    public int Prop1 { get; set; }
    public string Prop2 { get; set; }
    public bool Prop3 { get; set; } // <- because bool is ignored, you could simply delete this row
}

class Type2
{
    public int Prop1 { get; set; }
    public string Prop2 { get; set; }
    public TypeToIgnore Prop3 { get; set; }
    public long Prop4 { get; set; }
    public double Prop5 { get; set; }
}

class MappingProfile : Profile
{
    public MappingProfile()
    {
        ShouldMapProperty = p => p.PropertyType != typeof(bool);
        CreateMap<Type2, Type1>();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...