为什么AutoMapperExtension的行为与直接实现不同?

时间:2015-10-02 20:40:01

标签: c# automapper

我在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

1 个答案:

答案 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调试器同时观看PhotoValueViewModelPropertyViewModel.Value