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");
这两种方法的实际区别是什么?
不同之处在于,在访问源值和条件谓词之前执行了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