AutoMapper - Condition和PreCondition的区别是什么?

本文关键字:区别 是什么 PreCondition Condition AutoMapper | 更新日期: 2023-09-27 18:18:21

假设使用AutoMapper进行如下映射:

mapItem.ForMember(to => to.SomeProperty, from =>
{
    from.Condition(x => ((FromType)x.SourceValue).OtherProperty == "something");
    from.MapFrom(x => x.MyProperty);
});

替换条件与前提条件的区别:

    from.PreCondition(x => ((FromType)x.SourceValue).OtherProperty == "something");

这两种方法的实际区别是什么?

AutoMapper - Condition和PreCondition的区别是什么?

不同之处在于,在访问源值和条件谓词之前执行了PreCondition,所以在这种情况下,在从MyProperty获取值之前,PreCondition谓词将运行,然后从属性中评估值,最后执行Condition。

在下面的代码中,您可以看到

class Program
{
    static void Main(string[] args)
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Person, PersonViewModel>()
                .ForMember(p => p.Name, c =>
                {
                    c.Condition(new Func<Person, bool>(person =>
                    {
                        Console.WriteLine("Condition");
                        return true;
                    }));
                    c.PreCondition(new Func<Person, bool>(person =>
                    {
                        Console.WriteLine("PreCondition");
                        return true;
                    }));
                    c.MapFrom(p => p.Name);
                });
        });
        Mapper.Instance.Map<PersonViewModel>(new Person() { Name = "Alberto" });
    }
}
class Person
{
    public long Id { get; set; }
    private string _name;
    public string Name
    {
        get
        {
            Console.WriteLine("Getting value");
            return _name;
        }
        set { _name = value; }
    }
}
class PersonViewModel
{
    public string Name { get; set; }
}

这个程序的输出是:

PreCondition
Getting value
Condition

因为Condition方法包含一个接收ResolutionContext实例的重载,该实例有一个名为SourceValue的属性,Condition从源计算属性值,以在ResolutionContext对象上设置SourceValue属性。

注意:

此行为在版本<= 4.2.1和>= 5.2.0之前正常工作。

在5.1.1和5.0.2之间的版本,该行为不再正常工作。

这些版本的输出是:

Condition
PreCondition
Getting value