在没有IValueResolver的.ForMember()中访问IMappingOperationOptions字典

时间:2013-12-23 18:31:41

标签: .net automapper

我正在尝试映射两个对象,并且目标包含需要其他数据源的数据。这些是类:

public class SourceClass {
  public int SrcValueOne { get; set; }
}

public class DestClass { 
  public int DestValueOne { get; set; }

  public int ValueFromConfig { get; set; }
}

public class ConfigSettings { 
  public int ConfigValueOne { get; set; }
}

我需要将SourceClass中的值映射到DestClass,同时将填充的ConfigSettings对象(在运行时)传递给Map()并从那里读取一些值。到目前为止,我发现的所有方法都是ResolveUsing方法似乎并不理想。我想知道是否有办法做类似的事情:

Mapper.CreateMap<SourceClass, DestClass>()
  .ForMember(dest => dest.DestValueOne, src => src.MapFrom(a => a.SrcValueOne))
  .ForMember(dest => dest.ValueFromConfig, src => opt.ResolveUsing<ConfigSettings>.FromMember(config => config.ConfigValueOne);

我想出了如何使用Items集合在运行时在Map()中传递填充的对象,但无法确定是否有办法在ResolveUsing 中使用来访问它创建解析器和/或使用反射。

1 个答案:

答案 0 :(得分:1)

Mapper.CreateMap<ConfigSettings, DestCLass>()
   .ForMember(dest => dest.ValueFromConfig, opt => opt.MapFrom(s => s.ConfigValueOne))
   .ForMember(dest => dest.DestValueOne, opt => opt.Ignore());
Mapper.CreateMap<SourceClass, DestClass>()
  .ForMember(dest => dest.DestValueOne, opt => opt.MapFrom(a => a.SrcValueOne))
  .ForMember(dest => dest.ValueFromConfig, opt => opt.Ignore());

var dest = Mapper.Map(config);
Mapper.Map(source, dest);

如果您不想引入另一个类,这是最简单的选项。

添加新类可以帮助将其封装到只有一个Map调用:

public class ComplexSource
{
    public ConfigSettings Config{get;set;}
    public SourceClass SourceData{get;set;}
}

Mapper.CreateMap<ComplexSource, DestClass>()....