AutoMapper:将具体子类的Map Source属性映射到Destination类中的EnumValue

时间:2010-02-17 12:53:25

标签: enums automapper

我想为以下类定义映射(甚至是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; }
    }

如果我想根据具体的源类型在Destination类中指定DestinationEnum的目标值,那么AutoMapper Mapping会是什么样子? 例如。

  • 如果映射器从“Source”类映射到“Destination”,则如果Source.SourceEnumVal == fu
  • ,则Destination.EnumProperty应设置为“undefined”
  • 如果映射器从类“source”映射到“Destination”,则如果Source.SourceEnumVal ==“ba”,则Destination.EnumProperty应设置为“oneValue”
  • 如果映射器从类“ConcreteSource”映射到“Destination”,则如果ConcreteSource.ConcreteSourceEnumVal ==“second”,则Destination.EnumProperty应设置为“oneValue”
  • 如果映射器从“ConcreteSource”类映射到“Destination”,则如果ConcreteSource.ConcreteSourceEnumVal!=“second”,则Destination.EnumProperty应设置为“undefined”

1 个答案:

答案 0 :(得分:5)

您将创建两个地图:

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根据源类型和目标类型选择要使用的映射,因此无论您使用哪种源类型,都将选择正确的解析器。