C#递归嵌套结构中如何获取同类型InnerException的最内层实例
嵌套递归对象链末端值获取实现
前置修正
提供的示例代码存在属性名不匹配的编译问题:
- 类
InnerException定义的字符串属性为text - 但对象初始化示例中写的是
message
需要统一属性名(要么把类属性改为message,要么把初始化代码里的赋值字段改为text)后才能正常运行。
实现方案
1. 迭代遍历(优先推荐)
没有递归栈溢出风险,哪怕嵌套链路长达数万层也能稳定运行。
核心逻辑是从链路起点开始,逐层向下跳转,直到找不到下一层innerException时,当前节点就是目标末端实例。
public static string GetFinalNestedText(RequestTest rootRequest) { // 空引用防护 if (rootRequest?.innerException == null) return string.Empty; InnerException currentNode = rootRequest.innerException; // 逐次向下遍历,直到无下一层嵌套 while (currentNode.innerException != null) { currentNode = currentNode.innerException; } return currentNode.text; }
调用该方法传入初始化完成的request对象,即可直接得到末端存储的"inner 2"字符串。
2. 递归实现
代码更简洁,仅适合嵌套层级较浅的场景,过深的嵌套会触发栈溢出异常。
public static string GetFinalNestedTextRecursive(InnerException currentNode) { // 空值兜底 if (currentNode == null) return string.Empty; // 递归终止条件:当前节点无下一层嵌套 if (currentNode.innerException == null) return currentNode.text; // 向下查找下一层 return GetFinalNestedTextRecursive(currentNode.innerException); }
调用时传入链路第一层的InnerException实例即可:
var lastContent = GetFinalNestedTextRecursive(request.innerException);
注意事项
- 所有实现必须增加空值判断:如果链路中间某一层的
innerException提前为null,要做兜底处理,避免触发空引用异常 - 深层嵌套场景优先用迭代方案,无栈溢出风险、性能更稳定
- 注意统一类属性和初始化代码的字段名,否则无法通过编译
内容的提问来源于stack exchange,提问作者joeyanthon
相关产品推荐
相关产品推荐

