AutoMapper: сопоставить свойство Source конкретного подкласса с EnumValue в классе Destination - PullRequest
0 голосов
/ 17 февраля 2010

Я хотел бы определить отображение (или даже TypeConverter / Resolver) для следующих классов: Пункт назначения:

   public class Destination
    {
        public DestinationEnum EnumProperty { get; set; }

        public Destination()
        {
            EnumProperty = DestinationEnum.undefined;
        }
    }

    public enum DestinationEnum
    {
        oneValue,
        anotherValue, 
        undefined
    }

Источник:

    public enum SourceEnum
    { 
        fu,
        ba
    }

    public enum AnotherSourceEnum
    { 
        first,
        second, 
        third
    }

    public class Source
    {
        public SourceEnum SourceEnumVal { get; set; }
    }

    public class ConcreteSource : Source
    {
        public AnotherSourceEnum ConcreteSourceEnumVal { get; set; }
    }

Как будет выглядеть отображение AutoMapper, если я хочу указать целевое значение DestinationEnum в классе Destination в зависимости от конкретного типа источника? Например.

  • если преобразователь отображается из класса «Источник» в «Пункт назначения», для Destination.EnumProperty должно быть установлено значение «undefined», если Source.SourceEnumVal == fu
  • если преобразователь отображается из класса «source» в «Destination», для Destination.EnumProperty должно быть установлено значение «oneValue», если Source.SourceEnumVal == «ba»
  • если преобразователь отображается из класса "ConcreteSource" в "Destination", для Destination.EnumProperty должно быть установлено значение "oneValue", если ConcreteSource.ConcreteSourceEnumVal == "second"
  • если преобразователь отображается из класса "ConcreteSource" в "Destination", для Destination.EnumProperty должно быть установлено значение "undefined", если ConcreteSource.ConcreteSourceEnumVal! = "Second"

1 Ответ

5 голосов
/ 18 февраля 2010

Вы бы создали две карты:

Mapper.CreateMap<Source, Destination>();
Mapper.CreateMap<ConcreteSource, Destination>();

Затем создайте собственный преобразователь для каждой карты:

Mapper.CreateMap<Source, Destination>()
    .ForMember(dest => dest.EnumProperty, opt => opt.ResolveUsing<FirstResolver>());

Ваша вторая карта ConcreteSource будет использовать другой преобразователь:

Mapper.CreateMap<ConcreteSource, Destination>()
    .ForMember(dest => dest.EnumProperty, opt => opt.ResolveUsing<SecondResolver>());

AutoMapper выбирает используемое сопоставление на основе типа источника и назначения, поэтому будет выбран правильный преобразователь независимо от того, какой тип источника вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...