将对象传递给AutoMapper映射

我正在使用AutoMapper,正在映射的实体的一些值是我当前方法中的变量。 我试过谷歌它但无济于事。 我可以将一组KeyValue对或一个对象或东西传递给我的映射以使其使用这些值吗?

后映射修改的示例

//comment variable is a Comment class instance var imageComment = AutoMapper.Mapper.Map(comment); //I want to pass in imageId so I dont have to manually add it after the mapping imageComment.ImageId = imageId; 

AutoMapper开箱即可处理这个键值对场景。

 Mapper.CreateMap() .ForMember(d => d.Foo, opt => opt.ResolveUsing(res => res.Context.Options.Items["Foo"])); 

然后在运行时:

 Mapper.Map(src, opt => opt.Items["Foo"] = "Bar"); 

有点冗长,深入研究上下文项目,但你去了。

对于Automapper 6.0.2:

轮廓:

 public class CoreProfile : Profile { public CoreProfile() { CreateMap() .ForMember(d => d.Foo, opt => opt.ResolveUsing( (src, dst, arg3, context) => context.Options.Items["Foo"] ) ); } } 

制图:

  var result = Mapper.Map(aa, opt => { opt.Items["Foo"] = 2; opt.Items["OtherFoo"] = 1000; }); 

可以使用Items Dictionary选项将对象传递给解析程序。 执行此操作的标准API非常详细(如接受的答案中所示),但可以使用一些扩展方法很好地简化:

 ///  /// Map using a resolve function that is passed the Items dictionary from mapping context ///  public static void ResolveWithContext( this IMemberConfigurationExpression memberOptions, Func, TDest, TMember, TResult> resolver ) { memberOptions.ResolveUsing((src, dst, member, context) => resolver.Invoke(src, context.Items, dst, member)); } public static TDest MapWithContext(this IMapper mapper, TSource source, IDictionary context, Action> optAction = null) { return mapper.Map(source, opts => { foreach(var kv in context) opts.Items.Add(kv); optAction?.Invoke(opts); }); } 

哪个可以这样使用:

 // Define mapping configuration Mapper.CreateMap() .ForMember( d => d.ImageId, opt => opt.ResolveWithContext(src, items, dst, member) => items["ImageId"]) ); // Execute mapping var context = new Dictionary { { "ImageId", ImageId } }; return mapper.MapWithContext(source, context); 

如果您有一个通常需要传递给映射器解析器的对象(例如,当前用户),您可以更进一步,定义更专业的扩展:

 public static readonly string USER_CONTEXT_KEY = "USER"; ///  /// Map using a resolve function that is passed a user from the /// Items dictionary in the mapping context ///  public static void ResolveWithUser( this IMemberConfigurationExpression memberOptions, Func resolver ) { memberOptions.ResolveWithContext((src, items, dst, member) => resolver.Invoke(src, items[USER_CONTEXT_KEY] as User)); } ///  /// Execute a mapping from the source object to a new destination /// object, with the provided user in the context. ///  public static TDest MapForUser( this IMapper mapper, TSource source, User user, Action> optAction = null ) { var context = new Dictionary { { USER_CONTEXT_KEY, user } }; return mapper.MapWithContext(source, context, optAction); } 

哪个可以用作:

 // Create mapping configuration Mapper.CreateMap() .ForMember(d => d.Foo, opt => opt.ResolveWithUser((src, user) src.Foo(user)); // Execute mapping return mapper.MapWithUser(source, user); 

假设你有这两个对象:

 public class ObjectA { public string Property1 { get; set; } public int Property2 { get; set; } } public class ObjectB { public string Property1 { get; set; } public int Property2 { get; set; } } 

并且您希望将ObjectA类型的现有对象复制到ObjectA类型的新对象中,使用AutoMapper,您必须这样做:

 var objectA = new ObjectA { Property1 = "Hello, World!", Property2 = 1 } var objectB = new ObjectB(); // Copy data from a to b AutoMapper.Mapper .CreateMap() .BeforeMap((source, dest) => { dest.ImageId = imageId }); AutoMapper.Mapper.Map(objectA, objectB); // source, destination; // Or: var objectB = AutoMapper.Mapper.Map(objectA);