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

C#如何在字段声明时获取该字段自身名称以规避赋值错误

方案1:直接使用nameof(最低门槛,编译期安全)

这个方案不需要额外逻辑,直接把你写死的字符串替换成nameof(当前字段名)即可,nameof是C# 6及以上版本原生支持的编译期语法,会在编译时直接替换为对应的名称字符串:

// 编译后和你写死 "ErrorCode0001-C" 效果完全一致
const string ErrorCode0001 = nameof(ErrorCode0001) + "-C";
const string ErrorCode0002 = nameof(ErrorCode0002);
const string ErrorCode0003 = nameof(ErrorCode0003);
const string ErrorCode0004 = nameof(ErrorCode0004);
const string ErrorCode0005 = nameof(ErrorCode0005);
const string ErrorCode0006 = nameof(ErrorCode0006);

优势:

  • 完全编译期检查,如果你把nameof里的名称写错,编译器会直接报错,不会出现你遇到的复制粘贴漏改运行时才发现问题的情况
  • 支持IDE重命名功能,修改字段名时nameof里的内容会同步更新,不会出现不一致
  • 生成的是编译期常量,可以用于特性参数、switch case等需要常量的场景

方案2:静态类+反射批量初始化(零重复代码,无赋值错误)

如果你不想重复写两次字段名,可以把所有错误码放到同一个静态类中,用静态构造函数批量初始化所有字段,仅单独处理有特殊规则的字段即可:

public static class ErrorCodes
{
    // 只需要声明字段,不需要手动赋值
    public static readonly string ErrorCode0001;
    public static readonly string ErrorCode0002;
    public static readonly string ErrorCode0003;
    public static readonly string ErrorCode0004;
    public static readonly string ErrorCode0005;
    public static readonly string ErrorCode0006;

    static ErrorCodes()
    {
        // 批量给所有字段赋值为自身字段名
        var allFields = typeof(ErrorCodes).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
        foreach (var field in allFields)
        {
            field.SetValue(null, field.Name);
        }
        // 单独处理特殊后缀的字段
        ErrorCode0001 += "-C";
    }
}

优势:

  • 新增错误码只需要加一行字段声明即可,不需要写任何赋值逻辑,完全避免复制粘贴错误
  • 特殊规则的字段统一处理,不需要每个都单独写拼接逻辑
    注意:这个方案生成的是运行时常量(readonly),不能用于需要编译期常量的场景。

方案3:枚举+扩展方法(语义更清晰,易维护)

如果你的错误码是固定的枚举值,还可以用枚举加扩展方法的方式实现:

// 定义错误码枚举,新增错误码只需要加枚举项
public enum ErrorCode
{
    ErrorCode0001,
    ErrorCode0002,
    ErrorCode0003,
    ErrorCode0004,
    ErrorCode0005,
    ErrorCode0006
}

public static class ErrorCodeExtensions
{
    public static string ToCodeString(this ErrorCode code)
    {
        return code switch
        {
            ErrorCode.ErrorCode0001 => $"{nameof(ErrorCode.ErrorCode0001)}-C",
            // 默认直接返回枚举名称
            _ => code.ToString()
        };
    }
}

// 使用方式
var code = ErrorCode.ErrorCode0001.ToCodeString(); // 得到 "ErrorCode0001-C"
var code6 = ErrorCode.ErrorCode0006.ToCodeString(); // 得到 "ErrorCode0006"

优势:

  • 语义更清晰,参数传递用枚举类型,避免随便传字符串的问题
  • 维护成本低,新增错误码只需要加枚举项,特殊规则统一在扩展方法中处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:54:06