派生类的.Net扩展方法(TreeNode)

时间:2014-05-08 15:23:46

标签: c# linq extension-methods derived-class

我有一个树视图,只想返回满足给定条件的最深节点。

到目前为止,这个问题的答案是最有希望的:   Searching a tree using LINQ

所以我可以这样做:

foreach(CustomTreeNode aNode in treMyTreeView.Nodes){

    List<TreeNode> EligibleNodes = 
        aNode.Descendants().Where(node => node.Tag == SomeCondition)

}

(我意识到我可能需要做更多的工作才能从TreeNode转换为CustomTreeNode)

但在我到达那里之前,我一直试图将扩展方法添加到TreeNode类中。

public class CustomTreeNode : TreeNode  {

    static IEnumerable<TreeNode> Descendants(this TreeNode root) {
        var nodes = new Stack<TreeNode>(new[] { root });
        while (nodes.Count > 0) {
            TreeNode node = nodes.Pop();
            yield return node;
            foreach (TreeNode n in node.Nodes) nodes.Push(n);
        }
    }

}

您告诉我它需要是静态的,因此我无法从TreeNode派生。我不明白为什么。

我如何实现上述(或类似的东西)?

2 个答案:

答案 0 :(得分:3)

将它放在一个静态助手类中,如:

public static class CustomTreeNodeExtensions
{
    public static IEnumerable<TreeNode> Descendants(this TreeNode root)
    {
        // method
    }
}

扩展需要在静态类中。

但是如果您创建了一个CustomTreeNode类,无论如何,如果直接将它添加到类中,为什么要将它作为扩展方法呢?为什么不将它作为常规方法(如果你刚刚为扩展创建了CustomTreeNode,这是无关紧要的 - 在这种情况下:包含扩展方法的类不需要从你试图创建的类继承的扩展方法?

public class CustomTreeNode : TreeNode
{
    public IEnumerable<TreeNode> Descendants()
    {
        var nodes = new Stack<TreeNode>(new[] { this });
        // rest
    }
}

答案 1 :(得分:0)

您必须在单独的静态类中声明扩展方法。

public static class NodeExtensions
{
    static IEnumerable<TreeNode> Descendants(this TreeNode root) {
        var nodes = new Stack<TreeNode>(new[] { root });
        while (nodes.Count > 0) {
            TreeNode node = nodes.Pop();
            yield return node;
            foreach (TreeNode n in node.Nodes) nodes.Push(n);
        }
    }
}