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

C#自引用类型命名咨询及线性层级GetFullName方法实现

问题1:对应专业技术名称

这种在类型定义的属性中引用自身类型的结构,专业名称是递归类型(Recursive Type),也常称自引用类型,是用来建模线性层级从属关系(比如目录结构、组织架构、分类树)的常用设计方式。

问题2:GetFullName方法实现

实现时要注意两个核心问题:一是遍历顺序要从当前子节点向上追溯到根节点,最终拼接时要保证根节点名称在前、当前子节点名称在后;二是要做循环引用防护,避免出现A的父是B、B的父是A这类脏数据时程序死循环,另外优先用迭代实现而非递归,避免层级过深时出现栈溢出。

具体实现代码如下:

public string GetFullName(IParentChiled child, string separator = null)
{
    separator ??= "/";
    if (child == null)
        throw new ArgumentNullException(nameof(child));

    Stack<string> nameStack = new Stack<string>();
    HashSet<IParentChiled> visitedNodes = new HashSet<IParentChiled>();
    IParentChiled current = child;

    while (current != null)
    {
        // 检测到循环引用直接终止,避免死循环
        if (!visitedNodes.Add(current))
            throw new InvalidOperationException("节点存在循环父引用,无法生成完整路径名称");
        
        nameStack.Push(current.Name);
        current = current.Parent;
    }

    return string.Join(separator, nameStack);
}

实现说明:

  • 用栈存储遍历到的节点名称:向上追溯时先拿到的是下层节点名称,压栈后最终出栈拼接的顺序自然是根节点到当前节点的正确顺序,不需要额外做反转操作
  • 用哈希集合记录已访问的节点,一旦遍历到重复节点就判定存在循环引用,直接抛出异常
  • 全迭代实现,即使层级极深也不会出现栈溢出问题
  • 如果业务场景能100%保证不存在循环引用,可以移除哈希集合相关的检测逻辑,进一步提升性能

内容的提问来源于stack exchange,提问作者Mary Jane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:09:18