【问题标题】:AutoMapper: Map Source property of concrete subclass to an EnumValue in Destination classAutoMapper:将具体子类的 Source 属性映射到 Destination 类中的 EnumValue
【发布时间】:2010-02-17 12:53:24
【问题描述】:

我想为以下类定义一个映射(甚至是 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 映射会是什么样子? 例如。

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

【问题讨论】:

    标签: enums automapper


    【解决方案1】:

    您将创建两个地图:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多