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

能否从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:50:37