我的 ViewModel
类中的 Id
属性可以设置,但由于 setter 加密了值而无法获取。要获取该值,我必须使用 GetEncryptedId()
或 GetDecryptedId()
。
View 模型
public ViewModel
{
public int _id;
public int Id { set { _id = Encrypt(value); }
public Child ChildProperty {get; set; }
}
public Child
{
public int Id {get; set;}
public string Name {get; set; }
}
这里的问题是,出于某种原因,Auto Mapper 需要一个 get 访问器,以便它可以设置一个值。
public ViewModelProfile()
{
CreateMap<Model, ViewModel>().ForMember(vm => vm.Id, opt => opt.MapFrom(m => m.ChildProperty.Id))
}
这会抛出错误并指出:
CS0154 The property or indexer 'Id' cannot be used in this context because it lacks the get accessor.
- 为什么自动映射器需要“获取访问器”来设置值。
- 是否有配置选项可以强制设置而不获取?
作为解决方法,我添加了 Get { return -1; }
,但这远非理想。
最佳答案
这并不是 AutoMapper 本身的限制,而是其 API 构造方式的限制。表达式树 vm => vm.Id
无法构造,因为您已经猜到了,这是对属性 getter 的引用,这是不可能的,因为没有 getter。将表达式树作为引用成员的强类型方式传递是一种标准技术;到目前为止,AutoMapper 并不是唯一有此问题的东西。在这种情况下,AutoMapper 最终不会调用 getter 的事实并不重要。
幸运的是,ForMember
有一个重写,它接受成员名称作为字符串,并且使用它可以避免表达式树的问题:
CreateMap<Model, ViewModel>()
.ForMember(nameof(ViewModel.Id), opt => opt.MapFrom(m => m.ChildProperty.Id))
关于c# - AutoMapper 需要 Get Accessor 来设置。 CS0154 属性或索引器 'Id' 无法在此上下文中使用,因为它缺少 get 访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44889370/