如何修正基于JSON的Valera与Actions类属性修改代码
问题分析与修正方案
核心问题
- 类结构与JSON不匹配:原
Actions类中goToWork是方法,无法对应JSON里的goToWork对象,反序列化后会导致actions.goToWork为空,触发空引用异常。 - 属性修改逻辑错误:原代码直接将Valera的
Mana赋值为动作中的-30,这会覆盖原有值而非叠加变化量。 - 重复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
相关产品推荐
相关产品推荐

