首页 新闻 会员 周边 捐助

构造函数的参数名和字段必须一致吗

0
悬赏园豆:5 [已解决问题] 解决于 2023-04-07 21:08

[Required(ErrorMessage = "账号不能为空!")]
public string Account { get; set; }

/// <summary>
/// 密码
/// </summary>
[Required(ErrorMessage = "密码不能为空!")]
public string Password { get; set; }

public LoginModel(string username, string password)
{
    Account = username;
    Password = password;
}

public string Login([FromBody] LoginModel login)
{
return "{"code":20000,"data":{"token":"jack-token"}}";
}

为什么无法调用Login方法呢?LoginModel方法中的username改为account才能正常调用,这是因为构造函数的参数名和字段必须一致吗

天亦玄的主页 天亦玄 | 初学一级 | 园豆:31
提问于:2023-03-23 17:11
< >
分享
最佳答案
0

是的,这是因为 C# 是一种大小写敏感的语言。在 LoginModel 类中,属性 Account 和 Password 都是大写开头,而在构造函数中,参数 username 和 password 都是小写开头。这导致在实例化 LoginModel 对象时,参数值无法正确地传递到对应的属性中。

因此,如果您想要正确地实例化 LoginModel 对象并调用 Login 方法,您需要将构造函数的参数名改为与属性一致,即 Account 和 Password。或者,您可以通过在参数前添加 [JsonProperty(PropertyName = "account")] 和 [JsonProperty(PropertyName = "password")] 特性来指定 JSON 属性名,从而使参数与属性正确地匹配。例如:

csharp

public LoginModel([JsonProperty(PropertyName = "account")] string account, [JsonProperty(PropertyName = "password")] string password)
{
Account = account;
Password = password;
}
这样,无论您使用什么大小写形式的参数名,都可以正确地实例化 LoginModel 对象并调用 Login 方法。

收获园豆:5
Technologyforgood | 大侠五级 |园豆:7541 | 2023-03-27 21:56
其他回答(2)
0

public string Login([FromBody] LoginModel login) 这个方法参数 login 没有用到你定义的构造函数,用的是默认无参构造函数

dudu | 园豆:30783 (高人七级) | 2023-03-23 18:51

我传入的是:{"username":"jack","password":"123456"},为什么没有调用我定义的构造函数?

支持(0) 反对(0) 天亦玄 | 园豆:31 (初学一级) | 2023-03-24 08:40

@天亦玄: new LoginModel("jack", "123456") 才会调用你定义的构造函数

支持(0) 反对(0) dudu | 园豆:30783 (高人七级) | 2023-03-24 10:17

@天亦玄: 因为默认的DefaultModelBinder创建Model的时候使用的是Activator.CreateInstance(typeToCreate);

https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs

支持(0) 反对(0) talentzemin | 园豆:775 (小虾三级) | 2023-03-24 14:05
0

试了下,如果是用的System.Text.Json,有参构造函数的参数名和字段名是要一致
https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/immutability?pivots=dotnet-7-0#immutable-types-and-records

参数化构造函数的参数名称必须与属性名称和类型匹配。 匹配不区分大小写,即使使用 [JsonPropertyName] 重命名属性,构造函数参数也必须与实际属性名称匹配。

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-03-24 09:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册