【问题标题】:How to Create a TypeScript like String Literal Union type in C#如何在 C# 中创建类似 String Literal Union 类型的 TypeScript
【发布时间】:2018-12-08 20:34:30
【问题描述】:

我在 C# 中使用一些 JSON 和 API。我想知道如何处理这样的事情。

其中一个 JSON 值是一个字符串,可以是以下值之一:“Last_Day”、“Last_Week”、“Last_Month”。

在 TypeScript 中我可以这样做:

type DateSince = "Last_Day" | "Last_Week" | "Last_Month"

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

如果值不是这 3 个字符串,我会收到红色曲线错误。从技术上讲,我的值仍然是一个字符串,这是我需要与 JSON API 请求和响应一起使用的值。

我还没有找到在 C# 中执行此操作的好方法。甚至有可能在 C# 中相对容易地做到这一点吗?

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

【问题讨论】:

  • 这是否字面上是枚举类型无关紧要。你有一个字符串枚举作为事实上的枚举,所以它仍然适用。

标签: c# types enums


【解决方案1】:

正如@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,
}

Customizing Enumeration Member Values

【讨论】:

    【解决方案2】:

    在 C# 中,您可以使用枚举。

    public enum DateSince
    {
        Last_Day ,
        Last_Week,
        Last_Month
    }
    

    用法:

    var datesince = DateSince.Last_Day;
    

    Read more about C# Enums

    【讨论】:

    • 虽然我大体上同意这个答案,但如果没有对提问者进行更多研究,它并不能真正解决这个特定的问题:My value is still technically a string as well, which is what I need to use with the JSON API requests and responses. 除非你是 FGITW 并且打算在编辑...
    • @mattferderer 你仍然应该使用枚举,只需使用 JSON.net 进行序列化/解析并将this property attribute 提供给你的枚举值。
    • JSON.NET 可以使用 StringEnumConverter 对枚举进行序列化和反序列化。
    • 那么你应该接受@afrazier 的建议。使用枚举转换器进行 JSON 序列化。
    • 如果你不使用 JSON 和序列化,你为什么还要关心它的字符串值呢?重构其余代码以期望枚举,这是 C# 中的更好实践。
    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多