如何通过字符串名称读取局部float变量的值?
解决方法:通过字符串获取局部float变量值(调试用)
首先明确:你用GetProperty()完全找错了方向——这个方法是用来获取类的属性(Property)的,而你要访问的a、b是方法内的局部变量,既不是类的属性也不是成员字段,常规反射根本碰不到局部变量(它们存在于方法调用的栈帧里,没有公开的反射API能直接读取)。
给你两个简单可行的调试方案:
方案1:用字典映射(最简便,推荐)
直接把需要监控的局部变量和名称绑定到字典里,通过字符串键取值,代码简单易懂,完全不用碰反射:
public string variableName = "a"; void Update() { // 你的局部变量 float a = 1.2f; float b = 3.4f; // ...其他需要监控的float变量 float variableRead; // 调试用字典:键是变量名,值是对应变量的当前值 var debugVarMap = new Dictionary<string, float> { { "a", a }, { "b", b }, // 把所有需要监控的变量都按这个格式加进来 }; // 尝试获取值 if (debugVarMap.TryGetValue(variableName, out variableRead)) { // 拿到值了,这里可以做调试输出或其他操作 Debug.Log($"[{variableName}] = {variableRead}"); } else { Debug.LogWarning($"找不到名为{variableName}的变量"); } }
方案2:转成成员字段+反射(适合不想写字典的场景)
如果坚持想用反射,必须把局部变量改成类的成员字段(局部变量没法用反射访问),然后用GetField()获取字段值并强转:
public string variableName = "a"; // 把原来的局部变量改成类的私有成员字段 private float a; private float b; void Update() { // 给成员字段赋值 a = 1.2f; b = 3.4f; // ...其他变量赋值 float variableRead; // 获取字段:注意要指定BindingFlags,否则找不到私有字段 var targetField = this.GetType().GetField(variableName, BindingFlags.Instance | BindingFlags.NonPublic); if (targetField != null) { // 强转成float类型(因为GetValue返回object) variableRead = (float)targetField.GetValue(this); Debug.Log($"[{variableName}] = {variableRead}"); } else { Debug.LogWarning($"找不到名为{variableName}的字段"); } }
注意:两种方案都是调试用,不用在意性能问题,方案1代码量更少、更不容易出错,优先推荐。
内容的提问来源于stack exchange,提问作者lysandre aubourg
相关产品推荐
相关产品推荐

