Ada*_*dam 8 c# mapping automapper automapper-6
我读AutoMapper的ReverseMap()
,我不明白之间的差别ForMember()
和ForPath()
。此处描述了实现。以我的经验,我获得了ForMember()
。
在配置反向映射的地方,请参见以下代码:
public class Customer
{
public string Surname { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class CustomerDto
{
public string CustomerName { get; set; }
public int Age { get; set; }
}
static void Main(string[] args)
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Customer, CustomerDto>()
.ForMember(dist => dist.CustomerName, opt => opt.MapFrom(src => $"{src.Surname} {src.Name}"))
.ReverseMap()
.ForMember(dist => dist.Surname, opt => opt.MapFrom(src => src.CustomerName.Split(' ')[0]))
.ForMember(dist => dist.Name, opt => opt.MapFrom(src => src.CustomerName.Split(' ')[1]));
});
// mapping Customer -> CustomerDto
//...
//
// mapping CustomerDto -> Customer
var customerDto = new CustomerDto
{
CustomerName = "Shakhabov Adam",
Age = 31
};
var newCustomer = Mapper.Map<CustomerDto, Customer>(customerDto);
}
Run Code Online (Sandbox Code Playgroud)
这是工作。
做ForMember
和ForPath
相同的事情还是什么时候应该ForPath()
用完ForMember()
?
小智 6
ForMember()
只能访问映射对象的根属性。ForPath()
还可以访问其子属性。
根据我的经验,他们做同样的事情,但有一个例外。如果你有这样的事情:
a.CreateMap<Source, Destination>()
.ForMember(
a => a.RootProp.SubProp,
b => b.MapFrom(c => c.RootProp.Get()))
Run Code Online (Sandbox Code Playgroud)
它会失败并产生以下错误。
System.ArgumentException:“表达式 'a => a.RootProp.SubProp' 必须解析为顶级成员,而不是任何子对象的属性。您可以使用 ForPath(子类型上的自定义解析器)或 AfterMap 选项来代替。(参数'lambda表达式')'
因此,您需要ForMember()
像ForPath()
这样替换。
a.CreateMap<Source, Destination>()
.ForPath(
a => a.RootProp.SubProp,
b => b.MapFrom(c => c.RootProp.Get()))
Run Code Online (Sandbox Code Playgroud)
我使用AutoMapper 的经验有限,但它告诉我它ForPath()
具有相同的功能ForMember()
(尽管有一些额外功能)。通常情况下我们使用ForMember()
代替ForPath()
. 我不确定为什么,可能是由于性能问题。
在这种情况下,为避免不一致,ForPath
在内部转换为ForMember
. 虽然什么@IvanStoev说是有道理的,另一种方式来看待它是ForPath
的一个子集ForMember
。因为您可以在ForMember
. 因此,当您有成员时,请使用ForMember
,当您有路径时,请使用ForPath
:)
归档时间: |
|
查看次数: |
6183 次 |
最近记录: |