我在RegisterMappings()
的{{1}}内定义了以下映射:
AutoMapperConfig
此映射映射AutoMapper.Mapper.CreateMap<Member, PhotoViewModel>()
.ForMember(dest => dest.Show, opt => opt.MapFrom(src => src.ShowPhoto))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => AutoMapper.Mapper.Map<PhotoValueViewModel>(src));
AutoMapper.Mapper.CreateMap<Member, PhotoValueViewModel>();
的两个属性。首先,它根据PhotoViewModel
映射Show
属性,然后将src.ShowPhoto
映射到PhotoValueViewModel
属性。
映射有效!不幸的是,我有许多需要类似映射的对象。所以,我尝试将一些实现抽象为AutoMapperExtension方法。该方法如下所示:
Value
我希望这种扩展方法允许我将原始映射定义为:
public static IMappingExpression<TSource, TDestination> ApplyPropertyMapping<TSource, TDestination>
(this IMappingExpression<TSource, TDestination> iMappingExpression, Expression<Func<TSource, bool?>> show, Expression<Func<TSource, object>> value)
where TDestination : PropertyViewModel
{
iMappingExpression
.ForMember(dest => dest.Show, opt => opt.MapFrom(show))
.ForMember(dest => dest.Value, opt => opt.MapFrom(value));
return iMappingExpression;
}
但它不起作用!现在调用AutoMapper.Mapper.CreateMap<Member, PhotoViewModel>()
.ApplyPropertyMapping(src => src.ShowPhoto, src => AutoMapper.Mapper.Map<PhotoValueViewModel>(src));
将Mapper.Map<Member, PhotoViewModel>(MemberObject, PhotoViewModelObject)
属性设置为null。
造成差异的原因是什么?
其中一些对象的定义是:
PhotoViewModelObject.Value
答案 0 :(得分:2)
PhotoViewModel
类包含名称为Value
的两个属性,其中一个属性在PropertyViewModel
中定义,类型为object
。另一个在PhotoViewModel
中定义并且类型为PhotoValueViewModel
(这基本上是hiding另一个属性,您应该从Visual Studio收到关于此的警告。)
在您的扩展程序中,您引用了PropertyViewModel.Value
object
这是因为此方法中声明的TDestination
类型可以从PropertyViewModel
(通过where TDestination : PropertyViewModel
)分配。
您的扩展方法工作正常,它正在更改该属性的值(PropertyViewModel.Value
)。
您的原始映射(不使用扩展方法)将值映射到类型为PhotoViewModel.Value
的{{1}}。
在这两种情况下(使用或不使用扩展方法),您都可以使用Visual Studio调试器同时观看PhotoValueViewModel
和PropertyViewModel.Value
。