C#递归方法返回异常求助:调用后返回两次致结果错误
解决递归函数返回两次的问题
我来帮你揪出问题所在啦!你的递归函数之所以会出现“返回两次”、结果错误的情况,核心原因是递归调用时没有返回递归的结果,导致每一层递归执行完后,都会继续执行当前层的return obj.ToString(),相当于多返回了一次当前层的对象值。
问题代码的核心问题
看你的递归实现:
public static string GetProp(string[] classes, object oldObj) { var obj = oldObj.GetType().GetProperty(classes[0]).GetValue(oldObj, null); if(classes.Length>1) { classes = classes.Skip(1).ToArray(); GetProp(classes, obj); // 这里只调用了递归,但没有返回结果! } return obj.ToString(); }
当classes.Length>1时,你调用了GetProp(classes, obj),但没有把这个递归调用的结果返回出去。递归执行完后,程序会继续往下走到return obj.ToString(),这就导致:
- 内层递归的结果没有被传递回上层
- 当前层会额外返回自己的
obj.ToString(),最终你拿到的是最外层的对象值,而不是递归到最后一层的目标属性值
修正后的代码
只需要在递归调用前加上return,让递归的结果逐层传递回来就好:
public static string GetProp(string[] classes, object oldObj) { var obj = oldObj.GetType().GetProperty(classes[0]).GetValue(oldObj, null); if(classes.Length>1) { classes = classes.Skip(1).ToArray(); return GetProp(classes, obj); // 关键:返回递归调用的结果 } return obj.ToString(); }
额外优化建议(可选)
每次用Skip(1).ToArray()都会创建新数组,有点浪费性能。可以改用索引来遍历属性链,避免重复创建数组:
// 对外暴露的方法 public static string GetProp(string[] classes, object oldObj) { return GetPropInternal(classes, oldObj, 0); } // 内部递归方法,用索引跟踪当前处理到第几个属性 private static string GetPropInternal(string[] classes, object currentObj, int currentIndex) { var propValue = currentObj.GetType().GetProperty(classes[currentIndex]).GetValue(currentObj, null); // 如果还没到最后一个属性,继续递归 if (currentIndex < classes.Length - 1) { return GetPropInternal(classes, propValue, currentIndex + 1); } // 到最后一个属性了,返回其字符串值 return propValue.ToString(); }
这样修改后,递归就会正确返回最内层的目标属性值,不会再出现“返回两次”的问题啦!
内容的提问来源于stack exchange,提问作者Detlef D Soost
相关产品推荐
相关产品推荐

