AutoMapper 根据其他模型属性值映射所有属性

Posted

技术标签:

【中文标题】AutoMapper 根据其他模型属性值映射所有属性【英文标题】:AutoMapper Map all properties based on other model property value 【发布时间】:2019-04-12 22:37:39 【问题描述】:

我有以下情况:

源类:

   public class Source
    
      public int? A  get; set; 

      public int? B  get; set; 

      public int? C  get; set; 
    

目标类:

 public class Destination
    
        public int A  get; set; 

        public bool AIsNull  get; set; 

        public int B  get; set; 

        public bool BIsNull  get; set; 

        public int C  get; set; 

        public bool CIsNull  get; set; 
    

我想通过以下方式从 Source => Destion 获取映射:

尝试使用关联的源属性设置目标属性(这可以使用转换器完成(实现 ITypeConverter) 属性设置后,我想根据可为空的源属性设置目标关联的IsNull属性。

编辑,经过一番研究:

  class Program

    static void Main(string[] args)
    
        var srcClass = new SourceClass  Value1 = 10, Value2 = null, Value3 = 20 ;

        Mapper.Initialize(cfg =>
        
            cfg.ClearPrefixes();
            cfg.RecognizePostfixes("IsNull");
            cfg.CreateMap<SourceClass, TargetClass>();
        );

        var targetClass = Mapper.Map<SourceClass, TargetClass>(srcClass);

    


public class SourceClass

    public int? Value1  get; set; 
    public int? Value2  get; set; 
    public int? Value3  get; set; 


public class TargetClass

    public bool Value1IsNull  get; set; 
    public bool Value2IsNull  get; set; 
    public bool Value3IsNull  get; set; 

然而,这种情况并没有发生魔法

【问题讨论】:

RecognizeDestinationPostfixes 应该可以帮助您映射 IsNull 属性。 它没有多大帮助,或者我不知道如何使用它。我这样说是因为我只有目标模型的 IsNull 属性。 docs.automapper.org/en/latest/… 请看我的场景,不一样 不,其实很相似,你只需要考虑一下。浏览 AM 存储库中的相关测试。 【参考方案1】:

我认为这样的东西应该可以工作,我没有在 VS 中测试过,所以用一粒盐。

var map = CreateMap<Source,Target>();

map.ForAllMembers(opt => opt.Ignore());

map.ForMember(dest => dest.A, opt => opt.MapFrom( src => src.A.HasValue ? src.A.Value : 0));

map.ForMember(dest => dest.AIsNull, opt => opt.MapFrom( src => src.A.HasValue ? true : false));

【讨论】:

我明白你的意思,我认为这是我正在寻找的东西......但是我有 100 个属性是什么?有没有办法以通用方式映射所有内容?

以上是关于AutoMapper 根据其他模型属性值映射所有属性的主要内容,如果未能解决你的问题,请参考以下文章

[使用Automapper时,我是否也应该展平/映射视图模型的内部objetc?

Automapper 首先映射 EF 可投影属性,然后是其他属性

如何使用automapper映射与多个表的数据集

AutoMapper

0.AutoMapper

使用 automapper 映射模型而不是 foreach 语句