1

可以说我有这些模型

   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+Mouse 映射到 App_Start.MapConfig+Dog。引发了“AutoMapper.AutoMapperMappingException”类型的异常。

如何在不显式创建鼠标到狗之间的地图的情况下做到这一点?这是一个更大问题的简单示例。如果它们支持这种行为,我也愿意切换框架,例如 Value Injector、Glue 等。

4

1 回答 1

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

于 2013-03-25T15:00:22.147 回答