C#中如何从非Main()类访问字典?
解决方法
直接修复报错
你报错的原因很明确:var只能用来声明局部变量(方法内部的变量),类的字段必须指定明确的类型,不能用var。把var替换成具体的Dictionary<string, building>类型就能解决:
// player.cs public class player { // 替换var为明确的字典类型 private Dictionary<string, building> OwnedBuildings = buildingDict.InitializeBuildings(); // 你的玩家操作方法... }
更合理的设计方案(推荐)
如果想保持Main()控制游戏机制、player类专注玩家逻辑的分工,更推荐通过构造函数注入的方式传递建筑字典,避免player类直接依赖buildingDict的静态方法,代码解耦性更好:
- 在Program.cs的Main中初始化字典并传递给Player
// Program.cs static void Main() { // 由Main控制游戏核心数据的初始化 var allAvailableBuildings = buildingDict.InitializeBuildings(); // 把初始化好的建筑字典传给Player的构造函数 var currentPlayer = new player(allAvailableBuildings); // 后续游戏逻辑... }
- 修改Player类接收并使用字典
// player.cs public class player { private Dictionary<string, building> OwnedBuildings; // 保存所有可购买建筑的字典,用于后续购买判断 private Dictionary<string, building> _allBuildings; // 通过构造函数注入外部初始化好的建筑数据 public player(Dictionary<string, building> allBuildings) { _allBuildings = allBuildings; // 玩家初始没有建筑,初始化空字典 OwnedBuildings = new Dictionary<string, building>(); } // 示例:玩家购买建筑的方法,专注玩家操作逻辑 public bool BuyBuilding(string buildingName) { if (_allBuildings.ContainsKey(buildingName) && !OwnedBuildings.ContainsKey(buildingName)) { OwnedBuildings.Add(buildingName, _allBuildings[buildingName]); // 这里可以添加扣钱、播放动画等玩家操作逻辑 return true; } return false; } }
补充说明
- 如果你的
OwnedBuildings是玩家已拥有的建筑,初始时应该是空字典而不是直接复制所有建筑字典,上面的示例已经考虑了这一点。 - 构造函数注入的方式能让
player类不依赖buildingDict的具体实现,后续如果要修改建筑初始化逻辑,只需要在Main()里调整,不需要改动player类,更符合代码的可维护性要求。
内容的提问来源于stack exchange,提问作者Rsp8
相关产品推荐
相关产品推荐

