代码之家  ›  专栏  ›  技术社区  ›  tobsen

automapper:将具体子类的源属性映射到目标类中的枚举值

  •  0
  • tobsen  · 技术社区  · 15 年前

    我想为以下类定义一个映射(甚至一个类型转换器/解析器): 目的地:

       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; }
        }
    

    如果我想根据具体的源类型在目标类中指定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”,则如果ConcreteSource.ConcreteSourceNumVal,则Destination.EnumProperty应设置为“Undefined”!=“第二”
    1 回复  |  直到 15 年前
        1
  •  5
  •   Jimmy Bogard    15 年前

    您将创建两个映射:

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

    然后为每个映射执行自定义冲突解决程序:

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

    您的第二个具体源映射将使用不同的解析器:

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

    automapper根据源类型和目标类型选择要使用的映射,因此无论使用哪种源类型,都将选择正确的冲突解决程序。