c# - 为什么 AutoMapper 嵌套映射在没有内部类型的 CreateMap 的情况下工作

标签 c# automapper

自动映射模型:

public class OuterSource
{
    public int Value { get; set; }
    public InnerSource Inner { get; set; }
}

public class InnerSource
{
    public int OtherValue { get; set; }
}

public class OuterDest
{
    public int Value { get; set; }
    public InnerDest Inner { get; set; }
}

public class InnerDest
{
    public int OtherValue { get; set; }
}

我发现如果我注释掉内部类型的CreateMap。 嵌套映射仍然有效。我想了解它为什么有效,因为文档中没有明确说明。

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<OuterSource, OuterDest>();
    // cfg.CreateMap<InnerSource, InnerDest>();    // <-- don't need this
});
config.AssertConfigurationIsValid();

var source = new OuterSource
{
    Value = 5,
    Inner = new InnerSource {OtherValue = 15}
};
var mapper = config.CreateMapper();
var dest = mapper.Map<OuterSource, OuterDest>(source);

注意:我使用的是AutoMapper 8.1.0版本

最佳答案

Looking at source code on github for Automapper我们可以很容易地看到它使用 GetOrAdd 方法从 ConcurrentDictionary 获取了一个 mapper 函数。这意味着如果它不存在于缓存中,则会创建它。

 public Delegate GetMapperFunc(MapRequest mapRequest) => _mapPlanCache.GetOrAdd(mapRequest).Typed;

关于c# - 为什么 AutoMapper 嵌套映射在没有内部类型的 CreateMap 的情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58640616/

相关文章:

c# - 获取用户名以显示在另一个表单的标签上。需要解释

c# - 使用 Socket 或 UdpClient 进行多播有什么功能上的区别吗?

c# - Dotnet Core 默认使用哪个 appsettings.json 文件,环境文件还是父文件?

automapper - Proxy<IEnumerable> 类型中的方法 'GetEnumerator' 没有实现

c# - 如何使用自动映射器将源类型的父级映射到目标类型的集合中?

c# - AutoMapper - 忽略所有实现的基类的属性

c# - 我可以在初始配置后(在运行时)关闭 NHibernate ShowSQL

C#如何实现带时间步长的循环

c# - AutoMapper 问题和映射 IEnumerable 集合

c# - 使用存储库的对象映射器