如何将AutoMapper配置为全局忽略具有无法访问的Setter(私有或受保护)的所有属性?

时间:2016-09-28 15:54:51

标签: c# automapper

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

cfg.CreateMap<Dto, InternetContract>();

public class InternetContract
{      

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

    public string Package { get; set; }  
}

1 个答案:

答案 0 :(得分:1)

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

    Mapper.Initialize(cfg =>
    {
        cfg.ShouldMapProperty = p =>
        {
            var setMethod = p.GetSetMethod(true);
            return !(setMethod == null || setMethod.IsPrivate || setMethod.IsFamily);
        };
    });

但是,这可能不是你想要的,因为它会忽略整个属性(getter和setter)。如果要将源InternetContract映射到目标Dto,则即使Package属性具有公共getter,也将忽略Package属性。我无法找到一种全局更改此行为的方法,仅在目标属性为private / protected时才应用。这很不幸。默认情况下,AutoMapper将绕过您在类中构建的保护,并且没有简单的方法可以全局更改该默认值。

值得注意的是...... Jimmy Bogard设计的AutoMapper可以从Entity进行单向映射 - &gt; Dto,而不是相反。这是有道理的,但有些情况下从Dto手动映射每个标准属性 - &gt;实体很费力。在这些情况下,AutoMapper仍然可以提供帮助,但是为了忽略私有/受保护的setter,你必须显式地忽略AllllPropertiesWithAnInaccessibleSetter()。

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

参考文献: