是否可以使用AutoMapper为私有setter分配属性?与私人setter的AutoMapper映射属性
13
A
回答
15
如果你在这样
public class RestrictedName
{
public RestrictedName(string name)
{
Name = name;
}
public string Name { get; private set; }
}
public class OpenName
{
public string Name { get; set; }
}
构造函数中设置该属性值,那么你可以使用ConstructUsing这样
Mapper.CreateMap<OpenName, RestrictedName>()
.ConstructUsing(s => new RestrictedName(s.Name));
,与此代码
var openName = new OpenName {Name = "a"};
var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName);
Assert.AreEqual(openName.Name, restrictedName.Name);
9
工作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将映射属性与没有问题的私人二传手。如果你想强制封装,你需要使用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
In Silverlight, you cannot use reflection to access private types and members.
3
见#600 Private/internal destination properties。
解决方案:
public class PrivateInternalProfile {
protected override Configure() {
ShouldMapField = fieldInfo => true;
ShouldMapProperty = propertyInfo => true;
CreateMap<User, UserDto>(); //etc
}
}
相关问题
- 1. 私人-setter属性
- 2. Automapper映射属性
- 3. Automapper映射异常与模型和私有属性
- 4. AutoMapper未映射子属性
- 5. 使用反射SetValue属性与私人setter
- 6. 映射与Automapper
- 7. 使用Automapper仅映射特定属性
- 8. 映射一个属性,使用AutoMapper
- 9. AUtomapper - 自定义属性映射
- 10. 添加另一个属性映射? (AutoMapper)
- 11. Automapper在映射时忽略属性
- 12. 忽略导航属性时,映射Automapper
- 13. AutoMapper可以映射静态属性吗?
- 14. Automapper映射子列表属性
- 15. AutoMapper - 跳过映射空属性
- 16. AutoMapper将未映射的属性映射到Dictionary/ExtensionData
- 17. protobuf-net没有序列化与私人setter的C#属性
- 18. Automapper是否应该与私人setter OOB一起工作?
- 19. 使用AutoMapper的问题将DAL属性映射到BLL属性
- 20. 如何在AutoMapper映射中忽略属性的属性?
- 21. 如何将LINQ EntitySet映射到属性setter中的List属性?
- 22. Automapper映射多个属性为单属性
- 23. 使用Automapper忽略映射属性与默认值
- 24. automapper - 如果属性类型与属性名称不同,则忽略映射 - C#
- 25. 私人属性
- 26. Automapper映射
- 27. Automapper V5忽略映射的性质
- 28. 映射属性
- 29. 映射属性?
- 30. AutoMapper映射多个模型并忽略不存在的属性
什么版本Automapper您使用的是?你尝试过吗? – PatrickSteele
@blockhead实际上这是一个非常重要的问题,不可变对象比可以随意更改的对象(通过公开公开暴露他们的setter)更好。这是实体框架最近添加了水合到私有属性中的能力的确切原因,以允许域模型在初始水合之后保持不可变。也许这不是leozilla需要刷新他们的架构。 ;) – Marchy
不好意思?私人财产应该是私人的。它是属于对象的数据,只有对象知道,应该知道这些数据。 – blockhead