Вы можете влиять на порядок отображения свойств с помощью SetMappingOrder
.
Убедитесь, что например. свойство Variable2
сопоставляется посредством вызова testFunction
до сопоставления свойства Variable3
.
После этого свойство Variable3
может быть сопоставлено со значением, уже установленным в свойстве Variable2
.
Для этого установите порядок отображения Variable2
, например, на. 1 и присвойте одному из Variable3
более высокое значение, например. 2.
В приведенном ниже примере показано, что testFunction
был выполнен только один раз, поскольку Variable2
и Variable3
присвоено одинаковое значение Guid
.
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<Source, Destination>()
.ForMember(
dest => dest.Variable2,
opt => {
opt.SetMappingOrder(1); // Will be mapped first.
opt.MapFrom(src => testFunction(src.Variable1));
})
.ForMember(
dest => dest.Variable3,
opt => {
opt.SetMappingOrder(2); // Will be mapped second.
opt.MapFrom((src, dest) => dest.Variable2);
});
});
IMapper mapper = new Mapper(config);
var source = new Source {
Variable1 = "foo"
};
var destination = mapper.Map<Destination>(source);
Console.WriteLine($"variable2: {destination.Variable2}");
Console.WriteLine($"variable3: {destination.Variable3}");
// variable2: FOO 377dd1f8-ec1e-4f02-87b6-64f0cc47e989
// variable3: FOO 377dd1f8-ec1e-4f02-87b6-64f0cc47e989
public string testFunction(String arg)
{
return $"{arg.ToUpper()} {Guid.NewGuid()}";
}
public class Source
{
public String Variable1 { get; set; }
}
public class Destination
{
public String Variable2 { get; set; }
public String Variable3 { get; set; }
}