AutoMapper:手动设置属性

use*_*393 25 c# automapper

我使用AutoMapper从平面DataObjects映射到胖BusinessObjects,反之亦然.我注意到,由于BusinessObjects的更改通知(使用自定义验证实现INotifyPropertyChanged等),从DataObjects到BusinessObjects的映射需要额外的时间.

因为我在映射期间通常不需要更改通知,所以我想将其关闭.所以我添加了一个属性"IsPropertyChangedEnabled".如果此属性设置为false,则不会引发NotifyPropertyChanged事件并保存时间.

题:

我可以告诉AutoMapper在映射过程的最开始将此属性设置为false吗?如果是这样,怎么样?

谢谢!

Ser*_*kiy 31

使用BeforeMap方法在映射过程之前设置属性值:

Mapper.CreateMap<Source, Destination>()
      .BeforeMap((s, d) => d.IsPropertyChangedEnabled = false );
Run Code Online (Sandbox Code Playgroud)

  • 2分钟?你为什么让我等那么久?:-) PS:"AfterMap"方法我发现自己是PPS:谢谢! (6认同)

Twi*_*ted 27

您还可以使用ForMember(),当设置为值的属性不在源对象中时,它还具有传递Mapper.AssertConfigurationIsValid()的标准单元测试的额外好处.

这是一个例子

Mapper.CreateMap<ClientData, GenerateClientLetterCommand>()
            .ForMember(x => x.Id, opt => opt.MapFrom( o => Guid.NewGuid()))
            .ForMember(x => x.Created, opt => opt.MapFrom( o => DateTime.Now));
Run Code Online (Sandbox Code Playgroud)

  • 只想警告`UseValue()`会导致映射静态值.所以在这里的答案中,"GenerateClientLetterCommand.Created"将始终设置为AutoMapper初始化时的单个"DateTime"值,即使在重复调用时也是如此!得到了一个错误,所以想要. (2认同)