【问题标题】:Using Automapper with Flags Enum使用带有标志枚举的 Automapper
【发布时间】:2015-12-15 18:51:41
【问题描述】:

我正在尝试弄清楚如何在以下场景中使用 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; }
    }

在实体模型的情况下,ClaimType 属性是一个标志枚举:-

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

    }

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

我是 AutoMapper 的新手,如有任何帮助,将不胜感激。

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

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

    这是在 AutoMapper 中设置它的方法(使用一种快速而肮脏的方法,只需 ToString()ing 枚举然后拆分字符串):

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

    你可以看到一个工作的.NETFiddle here

    【讨论】:

    • 谢谢。赞赏。
    【解决方案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());
    

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      相关资源
      最近更新 更多