忽略ResolveUsing
采用 IValueResolver 的重载,并且仅查看这 2 个方法:
void ResolveUsing(Func<TSource, object> resolver);
void MapFrom<TMember>(Expression<Func<TSource, TMember>> sourceMember);
这两个之间的主要区别似乎是 ResolveUsing
需要 Func<TSource, object>
,而 MapFrom 采用 Expression<Func<TSource, TMember>>
.
但是,在实际使用这些方法之一和 lambda 表达式的客户端代码中,它们似乎是可以互换的:
Mapper.CreateMap<SourceType, DestType>() // uses ResolveUsing
.ForMember(d => d.DestPropX, o => o.ResolveUsing(s => s.SourcePropY));
Mapper.CreateMap<SourceType, DestType>() // uses MapFrom
.ForMember(d => d.DestPropX, o => o.MapFrom(s => s.SourcePropY));
那么上述两种选择最终有什么区别呢?一个比另一个快吗?其中一个是比另一个更好的选择吗?如果是,什么时候/为什么?
最佳答案
过去我有一个 long email exchange on the mailing list与 Automapper 的作者一起。 MapFrom 将通过表达式一路进行 null 检查:
So you can do
opt => opt.MapFrom(src => src.SomeProp.Way.Down.Here.Somewhere)
and each level will get checked for nulls (as it already does for flattening).
关于AutoMapper:MapFrom 和 ResolveUsing 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14875075/