我在项目中使用Automapper,我需要动态定值目标对象的字段.
在我的配置中,我有类似的东西:
cfg.CreateMap() // ... .ForMember(dest => dest.Timestamp, opt => opt.MapFrom(src => src.SentTime.AddMinutes(someValue))) //... ;
该someValue
配置中的代码是,我需要在运行时传递给映射器并且不是所述源对象的一个字段的参数.
有没有办法实现这个目标?像这样的东西:
Mapper.Map(msg, someValue));
Richard.. 50
您不能完全按照自己的意愿行事,但是当您调用Map时,可以通过指定映射选项来获得非常接近的结果.忽略配置中的属性:
cfg.CreateMap() .ForMember(dest => dest.Timestamp, opt => opt.Ignore()) ;
然后在调用地图时传入选项:
int someValue = 5; var dto = Mapper.Map(message, opt => opt.AfterMap((src, dest) => dest.TimeStamp = src.SendTime.AddMinutes(someValue)));
请注意,您需要使用Mapper.Map
重载来使用此语法.
您不能完全按照自己的意愿行事,但是当您调用Map时,可以通过指定映射选项来获得非常接近的结果.忽略配置中的属性:
cfg.CreateMap() .ForMember(dest => dest.Timestamp, opt => opt.Ignore()) ;
然后在调用地图时传入选项:
int someValue = 5; var dto = Mapper.Map(message, opt => opt.AfterMap((src, dest) => dest.TimeStamp = src.SendTime.AddMinutes(someValue)));
请注意,您需要使用Mapper.Map
重载来使用此语法.
使用Map方法时另一个可能的选项是使用Items字典.例:
int someValue = 5; var dto = Mapper.Map(message, opts => opts.Items["Timestamp"] = message.SentTime.AddMinutes(someValue));
它的代码少一点,并且具有动态指定字段的优点.