使用带有标志枚举的Automapper

时间:2015-12-15 10:28:55

标签: c# automapper

我正在尝试使用以下场景来弄清楚如何使用AutoMapper: -

我有以下实体模型: -

public class Lender : LegacyEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ClaimType ClaimTypes { get; set; }

        //Other properties kepy out for brevity.
    }

以下是以下服务模式: -

public class LenderServiceModel 
    {
        [Editable(false)]
        public int Id { get; set; }

        [Editable(false)]
        public string Name { get; set; }

        [Editable(false)]
        public List<string> ClaimTypes { get; set; }
    }

对于Entity模型,ClaimType属性是Flags Enum: -

 [Flags]
    public enum ClaimType : int
    {
        A = 1,
        B = 2,
        C = 4,

    }

我希望能够从实体模型映射到服务模型。我需要在服务模型上将ClaimType映射到List,但我没有运气。

我是AutoMapper的新手,任何帮助都会被贬低。

2 个答案:

答案 0 :(得分:2)

首先,您需要获取枚举标志的字符串列表表示,这可以通过此语句完成

var t = Enum.GetValues(typeof(ClaimType)).Cast<ClaimType>().Where(r => (claimType & r) == r).Select(r => r.ToString()).ToList();

对于使用AutoMapper的特定映射,您需要在设置时指定它。 因此,这将是以下代码:所以我们使用列表转换将ClaimTypes字段从源映射到目标...

AutoMapper.Mapper.CreateMap<LegacyEntity, LenderServiceModel >()
    .ForMember(dest => dest.ClaimTypes,
               opts => opts.MapFrom(Enum.GetValues(typeof(ClaimType)).Cast<ClaimType>().Where(r => (src.ClaimTypes & r) == r).Select(r => r.ToString()).ToList());

答案 1 :(得分:2)

您需要为ClaimTypes创建属性映射,将每个flags值转换为字符串。有几种方法可以做到这一点。请查看this answer了解一些想法。

以下是如何在AutoMapper中进行设置的方法(使用快速而简单的方法只需ToString() enum然后拆分字符串):

Mapper.CreateMap<Lender, LenderServiceModel>()
    .ForMember(dest => dest.ClaimTypes, opts => opts.MapFrom(src =>
        src.ClaimTypes.ToString().Split(new string[]{", "}, StringSplitOptions.None).ToList()));

您可以看到有效的.NETFiddle here