能否从JSON文件读取静态值且无需实例化类访问?
问题描述
我最初用C#写了一段错误码记录的代码,把错误码硬编码在RecordId静态类里作为静态int字段:
public class RecordId { public static int UnknownCommand = 100; public static int SoftwareVersion = 101; public static int WarningError = 110; public static int AbortError = 111; // etc... }
不用实例化这个类,就能在代码任何地方通过RecordId.SoftwareVersion调用,再配合无需实例化的静态Logger类:
public class Logger { public static void LogExperiment(int key, string value) { // Append key and value to a hardcoded filename } }
这样在代码任意位置执行Logger.LogExperiment(RecordId.SoftwareVersion, "1.0");就能完成日志写入。
后来代码规模扩大,我想从JSON文件加载错误码,于是把RecordId改成了带属性的非静态类:
public class RecordIdNew { public string UnknownCommand { get; set; } public string SoftwareVersion { get; set; } public string WarningError { get; set; } public string AbortError { get; set; } }
但现在必须实例化才能访问里面的值。我想知道:能不能不用实例化RecordId类,同时还能访问从JSON加载的值?如果不行,有没有其他合适的结构实现这个需求?
解决方案
完全可以实现无需实例化就能访问JSON加载的错误码,这里提供两种实用方案:
方案一:静态类+静态构造函数加载JSON
把RecordId改成静态类,利用静态构造函数在程序首次访问该类时自动加载JSON并赋值。后续直接通过类名访问静态属性即可:
using Newtonsoft.Json; using System.IO; public static class RecordId { public static int UnknownCommand { get; private set; } public static int SoftwareVersion { get; private set; } public static int WarningError { get; private set; } public static int AbortError { get; private set; } // 静态构造函数,程序首次访问类时自动执行 static RecordId() { string jsonContent = File.ReadAllText("error_codes.json"); var loadedData = JsonConvert.DeserializeObject<RecordIdDto>(jsonContent); UnknownCommand = int.Parse(loadedData.UnknownCommand); SoftwareVersion = int.Parse(loadedData.SoftwareVersion); WarningError = int.Parse(loadedData.WarningError); AbortError = int.Parse(loadedData.AbortError); } // 与JSON结构匹配的私有DTO类,用于反序列化 private class RecordIdDto { public string UnknownCommand { get; set; } public string SoftwareVersion { get; set; } public string WarningError { get; set; } public string AbortError { get; set; } } }
注意:如果JSON中的错误码本身是数字类型,DTO类的属性可以直接用int,省去类型转换步骤;另外建议将JSON文件路径配置到appsettings.json而非硬编码,提升可维护性。
方案二:单例模式(支持动态重新加载)
如果需要在运行时重新加载错误码配置,单例模式是更灵活的选择,对外提供静态访问入口:
using Newtonsoft.Json; using System.IO; public class RecordId { private static RecordId _instance; private static readonly object _lockObj = new object(); // 私有构造函数,禁止外部实例化 private RecordId() { LoadFromJson(); } // 全局唯一实例的静态访问属性 public static RecordId Instance { get { if (_instance == null) { lock (_lockObj) { if (_instance == null) { _instance = new RecordId(); } } } return _instance; } } public int UnknownCommand { get; private set; } public int SoftwareVersion { get; private set; } public int WarningError { get; private set; } public int AbortError { get; private set; } // 手动调用可重新加载JSON配置 public void LoadFromJson() { string jsonContent = File.ReadAllText("error_codes.json"); var loadedData = JsonConvert.DeserializeObject<RecordIdDto>(jsonContent); UnknownCommand = int.Parse(loadedData.UnknownCommand); SoftwareVersion = int.Parse(loadedData.SoftwareVersion); WarningError = int.Parse(loadedData.WarningError); AbortError = int.Parse(loadedData.AbortError); } private class RecordIdDto { public string UnknownCommand { get; set; } public string SoftwareVersion { get; set; } public string WarningError { get; set; } public string AbortError { get; set; } } }
使用时通过RecordId.Instance.SoftwareVersion访问错误码,需要更新配置时调用RecordId.Instance.LoadFromJson()即可重新加载。
方案选择建议
- 若错误码无需动态更新,方案一更简洁高效,符合你原本的静态调用习惯;
- 若需要运行时重新加载配置或扩展更多逻辑,方案二更适合。
内容的提问来源于stack exchange,提问作者user20396240
相关产品推荐
相关产品推荐

