AutoMapper 现在允许(我不确定从什么时候开始)使用私有设置器映射属性。它使用反射来创建对象。
示例类:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
}
public class PersonDto
{
public string Fullname { get; private set; }
}
和映射:
AutoMapper.Mapper.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname));
var p = new Person()
{
Name = "John",
Surname = "Doe"
};
var pDto = AutoMapper.Mapper.Map<PersonDto>(p);
AutoMapper 将毫无问题地使用私有 setter 映射属性。如果想强制封装,需要使用IgnoreAllPropertiesWithAnInaccessibleSetter。使用此选项,所有私有属性(和其他不可访问的属性)将被忽略。
AutoMapper.Mapper.CreateMap<Person, PersonDto>()
.ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname))
.IgnoreAllPropertiesWithAnInaccessibleSetter();
如果您使用 Silverlight,问题就会出现。根据 MSDN:https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx
在 Silverlight 中,您无法使用反射来访问私有类型和成员。