我的actuallyAvailable
类中的Id
属性可以设置,但不会因为setter加密该值而得到。为了获得价值,我必须使用ViewModel
或GetEncryptedId()
。
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))
}
作为一项工作,我添加了CS0154 The property or indexer 'Id' cannot be used in this context because it lacks the get accessor.
,但这远非理想。
答案 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;
}