如何根据方法参数动态切换目标列表并获取对应生长时间?
问题分析与解决方法
你当前代码的核心问题是:$"{crop}Data"只是拼接出了一个字符串(比如输入"wheat"时得到"wheatData"),但这个字符串并不是对同名列表变量的引用。你调用[0]时,实际是取了字符串第一个字符的ASCII码值(比如"wheatData"的第一个字符是'w',对应ASCII码119),这和你想要访问列表第一个元素的需求完全不符。
下面是几种可行的实现方式:
1. 使用字典映射(推荐)
把作物名称和对应的生长数据列表关联起来,通过字典快速查找,代码简洁且易维护:
// 在类中定义字典(可以提前初始化好所有作物的数据) private Dictionary<string, List<int>> _cropGrowthMap = new Dictionary<string, List<int>>() { {"wheat", new List<int> {60, 120, 180}}, // 第一个元素是你要的生长时间60 {"corn", new List<int> {90, 150, 210}}, // 其他作物的数据依次添加 }; public int GetGrowthTime(string crop) { // 尝试从字典中获取对应作物的数据 if (_cropGrowthMap.TryGetValue(crop, out var growthData)) { return growthData[0]; // 返回生长时间 } // 处理找不到作物的情况 Debug.LogError($"未找到作物 {crop} 的生长数据"); return -1; // 返回一个无效值,根据需求调整 }
2. 使用Switch-Case分支
如果作物种类不多,可以用分支语句直接判断:
// 假设你已经定义了各个作物的列表变量 private List<int> wheatData = new List<int> {60, ...}; private List<int> cornData = new List<int> {90, ...}; public int GetGrowthTime(string crop) { switch (crop) { case "wheat": return wheatData[0]; case "corn": return cornData[0]; // 添加其他作物的case default: Debug.LogError($"未知作物类型:{crop}"); return -1; } }
不推荐的方式:反射
虽然可以通过反射根据字符串名字获取变量,但这种方式代码复杂、性能差,还容易出错,除非特殊场景,否则不建议使用。
内容的提问来源于stack exchange,提问作者Mengart
相关产品推荐
相关产品推荐

