如何在不使用IgnoreAllPropertiesWithAnInaccessibleSetter()的情况下自动忽略映射包?
cfg.CreateMap<Dto, InternetContract>();
public class InternetContract
{
public virtual string Package { get;protected set; }
}
public class Dto
{
public string Package { get; set; }
}
答案 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()的自定义属性。
参考文献: