问题
我有以下值解析器:
public class StudentResolver : IValueResolver<Lesson, LessonResponse, UserResponse>
{
private readonly ApplicationDbContext _dbContext;
public StudentResolver(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
public UserResponse Resolve(
Lesson lesson,
LessonResponse response,
UserResponse member,
ResolutionContext context)
{
var user = _dbContext.Users
.Where(x => x.Id == lesson.StudentId)
.FirstOrDefault();
if (user == null)
return null;
var result = Mapper.Map<UserResponse>(user); // this line triggers a "no parameterless constructor", why?
return result;
}
}
此解析器尝试获取此模型的 Student
属性:
public class LessonResponse
{
public string Id { get; set; }
public UserResponse Student { get; set; }
}
但是在线:
var result = Mapper.Map<UserResponse>(user);
我得到:
{System.MissingMethodException: No parameterless constructor defined for this object. at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at AutoMapper.MappingOperationOptions`2.CreateInstanceT}
该表达式中唯一应该创建的类型是 UserResponse
,其定义如下:
public class UserResponse
{
public string Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Picture { get; set; }
public string X { get; set; }
public bool IsAdmin { get; set; }
public bool IsClient { get; set; }
public bool IsInstructor { get; set; }
}
但它是可构造的,那么我做错了什么?
额外
映射配置文件如下:
public class MappingProfile : Profile
{
public MappingProfile() {
CreateMap<Lesson, LessonResponse>()
.ForMember(
dest => dest.Student,
opts => opts.ResolveUsing<StudentResolver>());
}
}
用户的映射是:
public class MappingProfile : Profile
{
public MappingProfile() {
CreateMap<ApplicationUser, UserResponse>()
.ForMember(
dest => dest.FullName,
opts => opts.MapFrom(
origin => origin.FirstName + " " + origin.LastName))
.ForMember(
dest => dest.IsAdmin,
opts => opts.ResolveUsing<IsAdminResolver>())
.ForMember(
dest => dest.IsInstructor,
opts => opts.ResolveUsing<IsInstructorResolver>())
.ForMember(
dest => dest.IsClient,
opts => opts.ResolveUsing<IsClientResolver>());
}
}
bool 解析器都类似于:
public class IsAdminResolver : IValueResolver<ApplicationUser, UserResponse, bool>
{
private readonly UserManager<ApplicationUser> _userManager;
public IsAdminResolver(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public bool Resolve(ApplicationUser user, UserResponse response, bool member, ResolutionContext context)
{
return _userManager.IsInRoleAsync(user, "Admin").Result;
}
}
最佳答案
由于我的注意力不集中,我遇到了同样的问题。我使用 Visual Studio 快速提示默认构造函数为继承自 Profile
的类生成了它,该类是 protected
而不是 public
。我希望这会对某人有所帮助。
关于c# - automapper 中没有为此对象定义无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189545/