AutoMapper需要设置Get Accessor。 CS0154财产或索引器' Id'不能在这种情况下使用,因为它缺少get访问器

时间:2017-07-03 15:32:16

标签: c# automapper

我的actuallyAvailable类中的Id属性可以设置,但不会因为setter加密该值而得到。为了获得价值,我必须使用ViewModelGetEncryptedId()

ViewModel

GetDecryptedId()

这里的问题是,由于某些原因,Auto Mapper需要一个get访问器,因此它可以设置一个值。

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; }
}

这引发错误说明:

public ViewModelProfile()
{
    CreateMap<Model, ViewModel>().ForMember(vm => vm.Id, opt => opt.MapFrom(m => m.ChildProperty.Id))
}
  1. 为什么Auto Mapper需要一个“获取访问器”&#39;设置一个值。
  2. 是否有配置选项强制设置并且没有get?
  3. 作为一项工作,我添加了CS0154 The property or indexer 'Id' cannot be used in this context because it lacks the get accessor. ,但这远非理想。

2 个答案:

答案 0 :(得分:2)

这不是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))

答案 1 :(得分:0)

我就这样做了:

 //Mapper Class

 public partial class AutoMapperConfig
 {
  public static MapperConfiguration UserLoginTovmLogin = null;

  public static void Mappings()
    {
        UserLoginTovmLogin = new MapperConfiguration(cfg =>
        cfg.CreateMap<User_Login, VmLogin>()
        .ForMember(conf => conf.LoginId, dto => dto.MapFrom(src => src.Login_Id))
        .ForMember(conf => conf.Passsword, dto => dto.MapFrom(src => src.Passsword)));
    }
  }
   //In your Data login class
   VmLogin IAuthRepository.Login(string loginId)
    {
        VmLogin login = new VmLogin();
        var result = //Your Data Logic
        AutoMapperConfig.UserLoginTovmLogin.CreateMapper().Map(result, login);
        return login; 
    }