假设我有这些模型
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等框架。
答案 0 :(得分:0)
如何在鼠标之间明确创建地图时如何做到这一点 一只狗?
答案很简单:你不能。
Automapper为映射对象提供了非常简单的逻辑。添加新映射时:
Mapper.CreateMap<Mouse, Cat>();
创建新TypeMap
并将其添加到类型映射列表中。是的,有简单的清单。每个TypeMap
都有两个属性:DestinationType
和SourceType
。中间没什么。当您尝试映射某个对象时,只需搜索列表中的第一个TypeMap
,其中完全相同的源和目标类型,如映射中所指定。它由以下方法完成(ConfigurationStore类负责保存已配置的映射):
TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
{
return this._typeMaps.FirstOrDefault<TypeMap>(x =>
((x.DestinationType == destinationType) &&
(x.SourceType == sourceType)));
}
因此,对于您的示例,列表中将有两个TypeMap
个对象,当然它们都不匹配DestinationType
等于Dog
和SourceType
等于的条件Mouse
。