AutoMapper 需要获取访问器来设置。CS0154 无法在此上下文中使用属性或索引器“Id”,因为它缺少 get 访问器

ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

Id我的ViewModel类中属性可以设置,但不能在设置器加密值时获取。要获得该值,我必须使用GetEncryptedId()or 或GetDecryptedId().

视图模型

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.
  1. 为什么 Auto Mapper 需要“获取访问器”来设置值。
  2. 是否有强制设置而不是获取的配置选项?

作为一种解决方法,我添加了一个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))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章