自动映射,通过链接关联映射对象?

时间:2013-03-25 14:20:12

标签: c# automapper

假设我有这些模型

   public class Mouse
    {
        public string Cheese { get; set; }
    }

    public class Cat
    {
        public string Hairball { get; set; }
    }

    public class Dog
    {
        public string ChewyToy { get; set; }
    }

我将鼠标映射到猫然后将猫映射到狗:

    Mapper.CreateMap<Mouse, Cat>().ForMember(m => m.Hairball, o => o.MapFrom(src => src.Cheese));
    Mapper.CreateMap<Cat, Dog>().ForMember(m => m.ChewyToy, o => o.MapFrom(src => src.Hairball));

通过扩展,鼠标也应该映射到狗,对吗? 当我尝试在两者之间进行映射时:

    var mouse = new Mouse() { Cheese = "Eat me" };

    Dog dog = Mapper.Map<Mouse, Dog>(mouse);

我得到一个例外:

  

尝试将App_Start.MapConfig +鼠标映射到   App_Start.MapConfig +狗。类型异常   &#39; AutoMapper.AutoMapperMappingException&#39;被扔了。

如何在鼠标与狗之间明确创建地图时如何做到这一点?这是一个更大问题的简单例子。如果他们支持这种行为,我也愿意切换Value Injector,Glue等框架。

1 个答案:

答案 0 :(得分:0)

  

如何在鼠标之间明确创建地图时如何做到这一点   一只狗?

答案很简单:你不能

Automapper为映射对象提供了非常简单的逻辑。添加新映射时:

Mapper.CreateMap<Mouse, Cat>();

创建新TypeMap并将其添加到类型映射列表中。是的,有简单的清单。每个TypeMap都有两个属性:DestinationTypeSourceType。中间没什么。当您尝试映射某个对象时,只需搜索列表中的第一个TypeMap,其中完全相同的源和目标类型,如映射中所指定。它由以下方法完成(ConfigurationStore类负责保存已配置的映射):

TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
{
    return this._typeMaps.FirstOrDefault<TypeMap>(x => 
               ((x.DestinationType == destinationType) && 
                (x.SourceType == sourceType)));
}

因此,对于您的示例,列表中将有两个TypeMap个对象,当然它们都不匹配DestinationType等于DogSourceType等于的条件Mouse