相关疑难解决方法(0)

如何定位记录类的属性?

定义记录类时,如何将属性定位到参数、字段或属性?

例如,我想使用,JsonIgnore但这不能编译,因为它对字段或属性有属性使用限制:

record Person(string FirstName, string LastName, [JsonIgnore] int Age);
Run Code Online (Sandbox Code Playgroud)

c# oop attributes c#-9.0 record-classes

15
推荐指数
2
解决办法
759
查看次数

不可为空的字符串类型,如何与Asp.Net Core选项一起使用

MS状态使用可为空和不可为空的引用类型更清楚地表达您的设计意图

我的目的是表达属性,Issuer并且Audience在我JwtOptions中永远不会为空。对于这些选项的消费者来说,哪个是非常合理的意图,不是吗?这些非空值由下面描述的Asp.Net Core验证来确保。

但是如果JwtOptions不是所有属性都由构造函数初始化,那么C#8编译器会报告

警告CS8618不可初始化的属性'Issuer'未初始化。

并且由于某些技术原因,Asp.Net Core选项不能具有带参数的构造函数。所以我坚持自己的意图。我可以关闭可为空的检查或声明Issuer和其他可为空的属性,但是我认为这不是最好的解决方案。

在这种情况下,有什么优雅的解决方案吗?

csproj的片段:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  <LangVersion>8.0</LangVersion>
  <Nullable>enable</Nullable>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我在Asp.Net Core应用程序中具有以下强类型选项:

public class JwtOptions
{
    [Required]
    public string Issuer { get; set; }

    [Required]
    public string Audience { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

选项由Startup.cs中的下一个代码配置:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddOptions<JwtOptions>()
            .Bind(Configuration.GetSection("JwtOption"))
            .ValidateDataAnnotations();
    }
Run Code Online (Sandbox Code Playgroud)

并被消耗HomeController

    public HomeController(IOptions<JwtOptions> options)
    {
        string audience = options.Value.Audience;
        string issuer = options.Value.Issuer;
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,对于使用者而言,nor Audience也 …

c# asp.net-core c#-8.0 nullable-reference-types

7
推荐指数
1
解决办法
1021
查看次数

.NET 5.0 Web API 不适用于具有所需属性的记录

我使用 C# 9.0record类型作为 .NET 5.0 Web API 项目的绑定模型。某些属性是必需的。

我正在使用record位置语法,但收到错误。

public record Mail(
    System.Guid? Id,
    [property: Required]
    string From,
    [property: Required]
    string[] Tos,
    [property: Required]
    string Subject,
    string[]? Ccs,
    string[]? Bccs,
    [property: Required]
    Content[] Contents,
    Attachment[]? Attachments
);
Run Code Online (Sandbox Code Playgroud)

然后将其公开为我的Index操作的绑定模型:

public async Task<ActionResult> Index(Service.Models.Mail mailRequest)
{
    …
}
Run Code Online (Sandbox Code Playgroud)

但是,每当我尝试发出请求时,都会收到以下错误:

记录类型“Service.Models.Mail”在属性“Contents”上定义了将被忽略的验证元数据。“内容”是记录主构造函数中的一个参数,验证元数据必须与构造函数参数相关联。

我尝试删除该属性上的Contents属性,但是对于下一个(先前的)属性它失败了。我尝试使用[param: …]而不是[property: …],以及混合它们,但不断收到相同类型的错误。

我环顾了网络,并没有发现任何针对 C# 9 记录以不同方式处理注释的建议。我尽力了,但我没有想法——除了将我的记录转换为 POCO。

asp.net5 asp.net-core-webapi c#-9.0 c#-record-type

5
推荐指数
1
解决办法
382
查看次数