如何配置AutoMapper全局忽略所有属性与不可访问Setter(私有或保护)

本文关键字:保护 访问 属性 Setter 配置 何配置 AutoMapper 全局 | 更新日期: 2023-09-27 18:09:22

如何在不使用ignoreallpropertieswithaninaccesblesetter()的情况下自动忽略映射包?

cfg.CreateMap<Dto, InternetContract>();
public class InternetContract
{      
    public virtual string Package { get;protected set; }  
}
public class Dto
{      
    public string Package { get; set; }  
}

如何配置AutoMapper全局忽略所有属性与不可访问Setter(私有或保护)

从技术上讲,这将满足您的要求:

    Mapper.Initialize(cfg =>
    {
        cfg.ShouldMapProperty = p =>
        {
            var setMethod = p.GetSetMethod(true);
            return !(setMethod == null || setMethod.IsPrivate || setMethod.IsFamily);
        };
    });
然而,这可能不是你想要的,因为它会忽略整个属性(getter和setter)。如果你要将源InternetContract映射到目标Dto,那么Package属性将被忽略,即使它有一个公共getter。我找不到一种方法来全局更改此行为,仅当目标属性是私有/受保护时才适用。这是不幸的。AutoMapper将绕过你在默认情况下内置到类中的保护,并且没有简单的方法可以全局更改该默认值。

注意……Jimmy Bogard设计AutoMapper是为了从Entity -> Dto进行单向映射,而不是相反。这是有道理的,但在某些情况下,手动将每个标准属性从d映射到-> Entity是很费力的。在这些情况下,AutoMapper仍然可以提供帮助,但要忽略私有/受保护的设置,你必须显式地使用ignoreallpropertieswithaninaccesblesetter()。

如果你喜欢使用AutoMapper属性,你可以写一个自定义属性,包括ignoreallpropertieswithaninaccesblesetter()。

引用:

  • 配置可见
  • HasAnInaccessibleSetter ()
  • AutoMapper
  • 中双向映射的情况使用带有属性的AutoMapper