如何在 C# 中创建类似 String Literal Union 类型的 TypeScript

mat*_*rer 9 c# enums types

我\xe2\x80\x99m 使用 C# 使用一些 JSON 和 API 进行工作。我想知道如何处理这样的事情。

\n\n

其中一个 JSON 值是一个字符串,可以是以下值之一: \xe2\x80\x9cLast_Day\xe2\x80\x9d、\xe2\x80\x9cLast_Week\xe2\x80\x9d、\xe2\x80\x9cLast_Month\ xe2\x80\x9d。

\n\n

在 TypeScript 中我可以这样做:

\n\n
type DateSince = "Last_Day" | "Last_Week" | "Last_Month"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我得到这样的类型提示:

\n\n

VS Code 类型提示建议 3 个可能的值。

\n\n

如果该值不是这 3 个字符串,则会出现红色波浪线错误。从技术上讲,我的值仍然是一个字符串,这是我需要在 JSON API 请求和响应中使用的值。

\n\n

我还没有找到在 C# 中做到这一点的好方法。在 C# 中是否可以相对轻松地做到这一点?

\n\n

我理想的解决方案是让我将自定义类型分配给变量,而不是使用字符串。这样我就不必记住可能的字符串值。

\n

mat*_*rer 7

正如 @PatrickRoberts 和 @afrazier 所建议的,最好的方法是使用枚举和 Json.NET StringEnumConverter。

[JsonConverter(typeof(StringEnumConverter))]
public enum DateSince
{
    [EnumMember(Value = "LAST_DAY")]
    LastDay,
    [EnumMember(Value = "LAST_WEEK")]
    LastWeek,
    [EnumMember(Value = "LAST_MONTH")]
    LastMonth,
}
Run Code Online (Sandbox Code Playgroud)

自定义枚举成员值