在 CreateMap()上,我想使用 ForMember()中的函数调用返回的值,以避免必须两次调用同一函数。 / p>
CreateMap<source, destination>()
.ForMember(dest => dest.Variable2, opt => opt.MapFrom(src => testFunction(src.Variable1))
.ForMember(dest => dest.Variable3, opt => opt.MapFrom(src => testFunction(src.Variable1));
答案 0 :(得分:1)
您可以影响通过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; }
}