I am working with AutoMapper and some of the values for the entity being mapped to are variables in my current method. I have tried to Google it but to no avail. Can I pass a set of KeyValue Pairs or an object or something to my mapping to have it use those values?
//comment variable is a Comment class instance
var imageComment = AutoMapper.Mapper.Map<Data.ImageComment>(comment);
//I want to pass in imageId so I dont have to manually add it after the mapping
imageComment.ImageId = imageId;
AutoMapper handles this key-value pair scenario out of the box.
Mapper.CreateMap<Source, Dest>()
.ForMember(d => d.Foo, opt => opt.ResolveUsing(res => res.Context.Options.Items["Foo"]));
Then at runtime:
Mapper.Map<Source, Dest>(src, opt => opt.Items["Foo"] = "Bar");
A bit verbose to dig into the context items but there you go.
As of version 8.0.0 the API of AutoMapper has been changed. In doing so ResolveUsing
was consolidated with MapFrom
. Take a look at the corresponding pull request for further information.
Profile
public class CoreProfile : Profile
{
public CoreProfile()
{
CreateMap<Source, Destination>()
.ForMember(d => d.Bar,
opt => opt.MapFrom(
(src, dst, _, context) => context.Options.Items["bar"]
)
);
}
}
Mapping
var destination = mapper.Map<Destination>(
source,opt => {
opt.Items["bar"] = "baz";
}
);
For Automapper 6.0.2:
Profile:
public class CoreProfile : Profile
{
public CoreProfile()
{
CreateMap<Source, Dest>()
.ForMember(d => d.Foo,
opt => opt.ResolveUsing(
(src, dst, arg3, context) => context.Options.Items["Foo"]
)
);
}
}
Mapping:
var result = Mapper.Map<PlanResult>(aa, opt => {
opt.Items["Foo"] = 2;
opt.Items["OtherFoo"] = 1000;
});