AutoMapper - Condition和PreCondition之间有什么区别

时间:2016-11-17 15:18:01

标签: c# automapper

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

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

Precondition的替代条件有什么区别:

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

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

1 个答案:

答案 0 :(得分:10)

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

在以下代码中,您可以看到此

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从source中计算属性值,以在ResolutionContext对象上设置SourceValue属性。

注意:

此行为在版本&lt; = 4.2.1和&gt; = 5.2.0之前正常工作。

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

这些版本的输出是:

Condition
PreCondition
Getting value