You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:47:54