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

如何修正基于JSON的Valera与Actions类属性修改代码

问题分析与修正方案

核心问题

  1. 类结构与JSON不匹配:原Actions类中goToWork是方法,无法对应JSON里的goToWork对象,反序列化后会导致actions.goToWork为空,触发空引用异常。
  2. 属性修改逻辑错误:原代码直接将Valera的Mana赋值为动作中的-30,这会覆盖原有值而非叠加变化量。
  3. 重复IO操作:每次调用动作方法都读取JSON文件,效率低下。

修正后的完整代码

1. 定义动作效果类

对应JSON中每个动作的属性结构:

public class ActionEffect
{
    public int Mana { get; set; }
    public int Happiness { get; set; }
    public int Fatigue { get; set; }
    public int Money { get; set; }
    public int Health { get; set; } // 兼容无该属性的动作
}

2. 重构Actions类

匹配JSON结构,缓存配置并修正属性修改逻辑:

public class Actions
{
    // 对应JSON中的动作属性
    public ActionEffect GoToWork { get; set; }
    public ActionEffect SeeNature { get; set; }

    // 静态缓存,避免重复读取文件
    private static Actions _configInstance;

    // 获取配置的私有方法
    private static Actions GetConfig()
    {
        if (_configInstance == null)
        {
            var jsonPath = @"C:\Users\User\RiderProjects\MarginalValera\MarginalValera\Properties\actions.json";
            var jsonContent = File.ReadAllText(jsonPath);
            _configInstance = JsonConvert.DeserializeObject<Actions>(jsonContent);
        }
        return _configInstance;
    }

    // 修正后的上班方法
    public void GoToWork(Valera valera)
    {
        var config = GetConfig();
        if (valera.Mana < 50 && valera.Fatigue < 10)
        {
            // 叠加变化量而非直接赋值
            valera.Mana += config.GoToWork.Mana;
            valera.Happiness += config.GoToWork.Happiness;
            valera.Fatigue += config.GoToWork.Fatigue;
            valera.Money += config.GoToWork.Money;
        }
    }

    // 同理实现SeeNature方法
    public void SeeNature(Valera valera)
    {
        var config = GetConfig();
        valera.Mana += config.SeeNature.Mana;
        valera.Happiness += config.SeeNature.Happiness;
        valera.Fatigue += config.SeeNature.Fatigue;
    }
}

3. 优化Valera类

用构造函数替代init方法,更符合C#规范:

public class Valera
{
    public int Health { get; set; }
    public int Mana { get; set; }
    public int Money { get; set; }
    public int Happiness { get; set; }
    public int Fatigue { get; set; }
    public bool Dead { get; set; }

    public Valera()
    {
        var jsonPath = @"C:\Users\User\RiderProjects\MarginalValera\MarginalValera\Properties\characteristics.json";
        var jsonContent = File.ReadAllText(jsonPath);
        var initialStats = JsonConvert.DeserializeObject<Valera>(jsonContent);

        Health = initialStats.Health;
        Mana = initialStats.Mana;
        Money = initialStats.Money;
        Happiness = initialStats.Happiness;
        Fatigue = initialStats.Fatigue;
        Dead = initialStats.Dead;
    }
}

使用示例

// 初始化Valera
var valera = new Valera();
// 创建Actions实例并调用方法
var actions = new Actions();
actions.GoToWork(valera);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:15:31