自定义栈实现中无法访问类及扩展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,提问作者Максим Устелемов
相关产品推荐
相关产品推荐

