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

2023-12-30

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

cfg.CreateMap<Dto, InternetContract>();

public class InternetContract
{      

    public virtual string Package { get;protected set; }  
}
public class Dto
{      

    public string Package { get; set; }  
}

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

    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 的单向映射,而不是相反。这是有道理的,但在某些情况下,手动将每个标准属性从 Dto -> Entity 映射起来很费力。 AutoMapper 在这些情况下仍然可以提供帮助,但要忽略私有/受保护的 setter,您必须显式 IgnoreAllPropertiesWithAnInaccessibleSetter()。

如果您喜欢使用 AutoMapper 属性,您可以编写一个包含 IgnoreAllPropertiesWithAnInaccessibleSetter() 的自定义属性。

参考:

  • 配置可见性 https://github.com/AutoMapper/AutoMapper/blob/master/docs/Configuration.md#configuring-visibility
  • HasAnInaccessibleSetter() https://github.com/AutoMapper/AutoMapper/blob/cb1ed2dc8de4d91f196852f7ee53be8f2e069dc5/src/AutoMapper/TypeExtensions.cs#L96
  • AutoMapper 中双向映射的情况 https://lostechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/
  • 将 AutoMapper 与属性结合使用 https://schneids.net/using-automapper-with-attributes/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何配置 AutoMapper 以全局忽略所有具有不可访问 Setter 的属性(私有或受保护)? 的相关文章

随机推荐