You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js转.NET开发者求教:C#如何实现字符串值枚举的优雅方案

在C#中实现类似Node.js的字符串值枚举(无需额外辅助类)

C#原生枚举确实只支持int、byte这类值类型,要实现你熟悉的Node.js式字符串值枚举效果,有几个优雅且不用额外写辅助类的方案:


方案1:静态类+常量字符串(最简单直接)

完全不用枚举,直接用静态类封装字符串常量,写法和Node.js的枚举几乎一致,调用也方便:

public static class CustomExceptions
{
    public const string UserNotFound = "User not found.";
    public const string InternalException = "Internal Exception.";
}

怎么用:

// 和调用枚举的方式一模一样
Console.WriteLine(CustomExceptions.UserNotFound);

好处:

  • 零额外代码,直接用,完美匹配你不想写辅助类的需求
  • 编译时检查,类型安全,不会写错名字
  • 学习成本极低,和你之前的Node.js写法无缝衔接

方案2:用Record Struct实现强类型"字符串枚举"

如果需要更强的类型约束(比如不想让别人随便传个普通字符串当错误码),可以用C# 9+的record struct来实现,还支持隐式转字符串,兼顾安全和易用:

public record struct CustomException(string Value)
{
    // 预定义的"枚举项"
    public static readonly CustomException UserNotFound = new("User not found.");
    public static readonly CustomException InternalException = new("Internal Exception.");

    // 隐式转字符串,不用额外写代码取值
    public static implicit operator string(CustomException exception) => exception.Value;
}

怎么用:

// 像枚举一样赋值
CustomException ex = CustomException.UserNotFound;
// 直接输出就是字符串
Console.WriteLine(ex);
// 也能直接赋值给字符串变量
string errorMsg = CustomException.InternalException;

好处:

  • 强类型保护,只能用预定义的项,避免非法值
  • 自带值相等性检查(record的特性),可以直接用==比较
  • 隐式转换让用法和普通字符串一样灵活

方案3:结合C# 11原始字符串字面量(处理复杂文本)

如果你的错误信息包含换行、特殊字符,用C# 11的原始字符串字面量能让代码更清爽,不用转义:

public static class CustomExceptions
{
    public const string UserNotFound = """User not found.""";
    public const string ComplexError = """
        请求处理失败:
        - 资源ID:{0}
        - 时间戳:{1}
        """;
}

好处:

  • 复杂文本不用转义,可读性拉满
  • 依然保持静态常量类的简洁性

至于你提到的[Description]特性,确实没必要——不仅要写反射代码读属性,还会有运行时开销,上面的方案都是编译期确定值,高效又省心。

内容的提问来源于stack exchange,提问作者perezvonish'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:25:24