我不断收到“需要有一个带有 0 个参数或只有可选参数的构造函数。(参数‘类型’)”

问题描述 投票:0回答:5

我使用的是版本 9。我使用的是基于配置文件的配置。当我运行应用程序时,Mapper.Map<>() 方法抛出以下异常:

JobAssist.Services.ResumeBankMgmt.API.Application.ViewModels.ResumeBankViewModel 需要有一个带有 0 个参数或仅可选参数的构造函数。 (参数“类型”)

我不知道是什么原因造成的。

c# automapper automapper-9
5个回答
13
投票

问题是我有一个参数的命名与我的类属性不完全相同。 请参阅我将构造函数中的

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

2
投票

经典映射适用于基于源成员的映射: https://docs.automapper.org/en/latest/Construction.html

如果您无法更改具有与成员不同的参数的构造函数的类(例如在合约中),则可以使用

ConstructUsing

您可以像这样使用它来指定参数:

Mapper.CreateMap<ObjectFrom, ObjectTo>()
    .ConstructUsing(x => new ObjectTo(arg0, arg1, etc));

在此处查看完整答案:Automapper - 如何映射到构造函数参数而不是属性设置器


2
投票

假设您有权访问源代码,并且这不在您引用的第 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)

其中任何一个都可能会导致更多问题,您需要解决这些问题,但其中一个是清除此错误的最低限度。


0
投票

在两个类之间映射时,使用“错误”访问修饰符(即

internal
而不是
public
)时,我收到此错误。


0
投票

对于记录用户,

ForCtorParam
显式用于映射到构造函数,而不是目标类型(通常是不可变值对象或记录)的
ForMember
参数。

© www.soinside.com 2019 - 2024. All rights reserved.