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
相关产品推荐
相关产品推荐

