定义记录类时,如何将属性定位到参数、字段或属性?
例如,我想使用,JsonIgnore但这不能编译,因为它对字段或属性有属性使用限制:
record Person(string FirstName, string LastName, [JsonIgnore] int Age);
Run Code Online (Sandbox Code Playgroud) 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# 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。