c# - AutoMapper 需要 Get Accessor 来设置。 CS0154 属性或索引器 'Id' 无法在此上下文中使用,因为它缺少 get 访问器

标签 c# automapper

我的 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.
  1. 为什么自动映射器需要“获取访问器”来设置值。
  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))

关于c# - AutoMapper 需要 Get Accessor 来设置。 CS0154 属性或索引器 'Id' 无法在此上下文中使用,因为它缺少 get 访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44889370/

相关文章:

c# - 访问odata/$metadata时Abp.AspNetCore.OData自引用循环

c# - AutoMapper 在投影到可为 null 的枚举时抛出异常

c# - 自动映射错误: The type does not have a default constructor

c# - 将枚举存储在数组中 VS 存储在字典中?

c# - 如何在 ms 图表中旋转特定标签?

c# - 是否有使用 Java、C#、Python 或 Ruby 编写的 Google Contacts API 的 Hello World 示例?

c# - AutoMapper 区分大小写还是不区分大小写?

c# - 如何在mongodb中选择嵌套文档?

c# - 从扩展方法中消除可推断的泛型类型参数

C#:如何使自动映射器映射类型对象的属性?