假设使用 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");
这两种方法有什么实际区别?
不同之处在于 Pre Condition 在访问源值和 Condition 谓词之前执行,因此在本例中,在获取值之前我的财产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 实例的重载,该实例具有名为的属性源值,Condition 评估源中的属性值,以设置 ResolutionContext 对象上的 SourceValue 属性。
注意力:
此行为在版本 = 5.2.0 之前都可以正常工作。
5.1.1 和 5.0.2 之间的版本,该行为不再正常工作。
这些版本的输出是:
Condition
PreCondition
Getting value
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)