假设使用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");
这两种方法之间的实际区别是什么?
答案 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