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

自定义栈实现中无法访问类及扩展TryPush方法的问题求助

解决自定义栈类访问LogicalTreeNode相关类型的问题

看起来你是想基于Stack<LogicalTreeNode>扩展出带有TryPush方法的自定义栈,但遇到了类型访问的问题。先帮你梳理下可能的原因和对应的解决方案:

先排查访问权限问题

你给出的类都是public修饰的,但如果你的自定义栈类和这些类不在同一命名空间下,或者所在的程序集没有引用包含这些类的程序集,就会出现无法访问的情况。解决方法:

  • 确保自定义栈类和LogicalTreeNode、LogicalOperator、ConditionResult在同一个命名空间,或者在自定义栈类所在文件顶部添加对应的using语句引用目标命名空间。
  • 如果是跨程序集的情况,要确保包含这些类的程序集被正确引用,并且类的访问修饰符确实是public(你代码里已经是了,这点没问题)。

实现自定义栈的两种方案

接下来给你两种实现带有TryPush方法且保留标准栈方法的方案:

方案1:继承Stack<LogicalTreeNode>

直接继承系统的Stack<T>类,这样天然就拥有所有标准栈方法,然后添加你的自定义TryPush方法:

// 确保和LogicalTreeNode等类在同一命名空间,或者添加using引用
public class LogicalTreeStack : Stack<LogicalTreeNode>
{
    // 自定义TryPush方法,示例逻辑:比如判断节点类型后决定是否入栈
    public bool TryPush(LogicalTreeNode node)
    {
        // 这里可以根据你的业务逻辑添加判断条件,比如只允许特定类型入栈
        if (node is LogicalOperator || node is ConditionResult)
        {
            base.Push(node);
            return true;
        }
        // 如果不符合条件就返回false
        return false;
    }
}

方案2:封装Stack<LogicalTreeNode>(组合模式)

如果不想继承系统类,可以用封装的方式,内部持有一个Stack<LogicalTreeNode>实例,然后暴露标准栈方法和自定义TryPush:

public class LogicalTreeStack
{
    private readonly Stack<LogicalTreeNode> _innerStack = new Stack<LogicalTreeNode>();

    // 暴露标准栈方法,直接调用内部栈的对应方法
    public LogicalTreeNode Pop() => _innerStack.Pop();
    public LogicalTreeNode Peek() => _innerStack.Peek();
    public void Clear() => _innerStack.Clear();
    public int Count => _innerStack.Count;
    public bool Contains(LogicalTreeNode item) => _innerStack.Contains(item);
    public void CopyTo(LogicalTreeNode[] array, int arrayIndex) => _innerStack.CopyTo(array, arrayIndex);
    public IEnumerator<LogicalTreeNode> GetEnumerator() => _innerStack.GetEnumerator();

    // 自定义TryPush方法
    public bool TryPush(LogicalTreeNode node)
    {
        // 这里替换成你的实际判断逻辑
        if (node != null) // 示例:非空节点允许入栈
        {
            _innerStack.Push(node);
            return true;
        }
        return false;
    }
}

测试示例

不管用哪种方案,都可以这样测试:

var stack = new LogicalTreeStack();
// 尝试入栈LogicalOperator
var op = new LogicalOperator("AND");
bool opPushed = stack.TryPush(op);
Console.WriteLine(opPushed); // 输出True

// 尝试入栈ConditionResult
var result = new ConditionResult(true);
bool resultPushed = stack.TryPush(result);
Console.WriteLine(resultPushed); // 输出True

// 测试标准方法
var topNode = stack.Peek();
Console.WriteLine(topNode is ConditionResult); // 输出True

如果还是遇到访问问题,检查下:

  • 所有类的命名空间是否一致,或者是否正确引用了命名空间
  • 项目的引用是否正确(如果是跨项目的情况)
  • 有没有拼写错误,比如类名大小写是否匹配

内容的提问来源于stack exchange,提问作者Максим Устелемов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:48