我使用的是版本 9。我使用的是基于配置文件的配置。当我运行应用程序时,Mapper.Map<>() 方法抛出以下异常:
JobAssist.Services.ResumeBankMgmt.API.Application.ViewModels.ResumeBankViewModel 需要有一个带有 0 个参数或仅可选参数的构造函数。 (参数“类型”)
我不知道是什么原因造成的。
问题是我有一个参数的命名与我的类属性不完全相同。 请参阅我将构造函数中的
categories
更改为 resumeCategories
。
原代码:
public class ResumeBankViewModel
{
public List<ResumeCategoryViewModel> ResumeCategories { get; set; }
public ResumeBankViewModel(int id, int jobSeekerID, List<ResumeViewModel> resumes, List<ResumeCategoryViewModel> categories)
}
新代码:
public class ResumeBankViewModel
{
public List<ResumeCategoryViewModel> ResumeCategories { get; set; }
public ResumeBankViewModel(int id, int jobSeekerID, List<ResumeViewModel> resumes, List<ResumeCategoryViewModel> resumeCategories)
}
经典映射适用于基于源成员的映射: https://docs.automapper.org/en/latest/Construction.html
如果您无法更改具有与成员不同的参数的构造函数的类(例如在合约中),则可以使用
ConstructUsing
。
您可以像这样使用它来指定参数:
Mapper.CreateMap<ObjectFrom, ObjectTo>()
.ConstructUsing(x => new ObjectTo(arg0, arg1, etc));
在此处查看完整答案:Automapper - 如何映射到构造函数参数而不是属性设置器
假设您有权访问源代码,并且这不在您引用的第 3 方程序集中...
查找类的定义
ResumeBankViewModel
(ViewModels\ResumeBankViewModel.cs 可能是一个不错的起点。)
并添加这一行:
public ResumeBankViewModel(){ }
如果有这样一行:
private ResumeBankViewModel() /* { etc. } */
或者这个:
internal ResumeBankViewModel() /* { etc. } */
您可以将
private
/internal
更改为 public
。
您可能还希望查看已定义的其他公共构造函数,并将一些适当的值传递给其中之一:
public ResumeBankViewModel() : this(value1, value2, value3) { }
或者使其参数可选:
public ResumeBankViewModel(object arg1 = value1, object arg2 = value2, object arg3 = value3)
其中任何一个都可能会导致更多问题,您需要解决这些问题,但其中一个是清除此错误的最低限度。
在两个类之间映射时,使用“错误”访问修饰符(即
internal
而不是 public
)时,我收到此错误。
ForCtorParam
显式用于映射到构造函数,而不是目标类型(通常是不可变值对象或记录)的 ForMember
参数。