如何使用AutoMapper将在ForMember()中的函数调用中获得的值传递给另一个函数

时间:2019-06-27 11:33:40

标签: c# .net automapper

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));

1 个答案:

答案 0 :(得分:1)

您可以影响通过SetMappingOrder映射属性的顺序。

确保例如在属性Variable2被映射之前,通过调用testFunction来映射属性Variable3
之后,可以从属性Variable3中已经设置的值映射属性Variable2

为此,请将Variable2的映射顺序设置为例如。 1,并给Variable3中的一个更高的值,例如。 2。

下面的示例显示testFunction仅运行一次,因为Variable2Variable3被赋予相同的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; }
}