简体   繁体   English

AutoMapper - Map 从 object 到枚举

[英]AutoMapper - Map from object to enum

I have this class:我有这个 class:

public class EntityClass
{
    public bool IsExempt { get; set; }
    public bool IsOverdue { get; set; }
    public SourceEnum Status { get; set; }
}

And these two enums:这两个枚举:

public enum SourceEnum
{
    NotSet = 0,
    InProgress,
    Submitted,
    AssessmentComplete,
    Complete
}

[Flags]
public enum DestinationEnum
{
    None = 0,

    [Description("Exempt")]
    Exempt = 1,

    [Description("Unset")]
    Unset = 2,

    [Description("Overdue")]
    Overdue = 3,

    [Description("In Progress")]
    InProgress = 4,

    [Description("Submitted")]
    Submitted = 5,

    [Description("Conf. Pending")]
    ConfirmationPending = 6,

    [Description("Complete")]
    Completed = 7
}

I want to map from EntityClass to DestinationEnum , I tried it this way:我想 map 从EntityClassDestinationEnum ,我是这样尝试的:

var config = new MapperConfiguration(cfg => cfg.CreateMap<EntityClass, DestinationEnum>()
                .ForMember(dest => dest, opt => opt.MapFrom(source => source.IsExempt ? DestinationEnum.Exempt : DestinationEnum.None))
                .ForMember(dest => dest, opt => opt.MapFrom(source => source.IsOverdue ? DestinationEnum.Overdue : DestinationEnum.None))

                .ForMember(dest => dest, opt => opt.MapFrom(source => source.Status == SourceEnum.InProgress ? DestinationEnum.InProgress : DestinationEnum.None))
                .ForMember(dest => dest, opt => opt.MapFrom(source => source.Status == SourceEnum.Complete ? DestinationEnum.Completed : DestinationEnum.None))
                .ForMember(dest => dest, opt => opt.MapFrom(source => source.Status == SourceEnum.AssessmentComplete ? DestinationEnum.ConfirmationPending : DestinationEnum.None))
                .ForMember(dest => dest, opt => opt.MapFrom(source => source.Status == SourceEnum.Submitted ? DestinationEnum.Submitted : DestinationEnum.None))
                .ForMember(dest => dest, opt => opt.MapFrom(source => source.Status == SourceEnum.NotSet ? DestinationEnum.Unset : DestinationEnum.None)));

var mapper = config.CreateMapper();

var entityClassObj = new EntityClass { IsExempt = true, IsOverdue = true, Status = SourceEnum.InProgress };

var result = mapper.Map<DestinationEnum>(entityClassObj);

When I run my code, it returns:当我运行我的代码时,它返回:

Custom configuration for members is only supported for top-level individual members on a type.成员的自定义配置仅支持类型上的顶级个人成员。

I tried the solution from here but unfortunately the IncludeMembers method is not available.我从这里尝试了解决方案,但不幸的是IncludeMembers方法不可用。 I am using AutoMapper 6.0.2.我正在使用 AutoMapper 6.0.2。

As @Lucian mentioned, you need to implement the Custom Type Converter for your scenario.正如@Lucian 提到的,您需要为您的场景实现自定义类型转换器

Solution 1解决方案 1

public class EntityClassToDestinationEnumConverter : ITypeConverter<EntityClass, DestinationEnum>
{
    public DestinationEnum Convert(EntityClass src, DestinationEnum dest, ResolutionContext context)
    {
        if (src.IsExempt)
            return DestinationEnum.Exempt;
            
        if (src.IsOverdue)
            return DestinationEnum.Overdue;
            
        switch (src.Status)
        {
            case SourceEnum.InProgress:
                return DestinationEnum.InProgress;
            case SourceEnum.Complete:
                return DestinationEnum.Completed;
            case SourceEnum.AssessmentComplete:
                return DestinationEnum.ConfirmationPending;
            case SourceEnum.Submitted:
                return DestinationEnum.Submitted;
            case SourceEnum.NotSet:
                return DestinationEnum.Unset;
        }
            
        return DestinationEnum.None;
    }
}

Your Mapping Profile or MapperConfiguration to map from EntityClass to DestinationEnum .您的映射配置文件或MapperConfiguration到 map 从EntityClassDestinationEnum

MapperConfiguration _config = new MapperConfiguration(config => 
{
    config.CreateMap<EntityClass, DestinationEnum>()
        .ConvertUsing<EntityClassToDestinationEnumConverter>();
});

Solution 2解决方案 2

Or writing a method for the logic without a custom type resolver class .或者为没有自定义类型解析器 class的逻辑编写方法。

public static class Helpers
{
    public static DestinationEnum ConvertFromEntityClassToDestinationEnum(EntityClass src)
    {
        if (src.IsExempt)
                return DestinationEnum.Exempt;

        if (src.IsOverdue)
            return DestinationEnum.Overdue;

        switch (src.Status)
        {
            case SourceEnum.InProgress:
                return DestinationEnum.InProgress;
            case SourceEnum.Complete:
                return DestinationEnum.Completed;
            case SourceEnum.AssessmentComplete:
                return DestinationEnum.ConfirmationPending;
            case SourceEnum.Submitted:
                return DestinationEnum.Submitted;
            case SourceEnum.NotSet:
                return DestinationEnum.Unset;
        }

        return DestinationEnum.None;
    }   
}
MapperConfiguration _config = new MapperConfiguration(config => 
{
    config.CreateMap<EntityClass, DestinationEnum>()
        .ConvertUsing(src => Helpers.ConvertFromEntityClassToDestinationEnum(src));
});

Demo Solution 1 & 2 @ .NET Fiddle演示解决方案 1 和 2 @ .NET 小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM