为TreeView.Node创建包装器

时间:2010-06-24 04:38:32

标签: c# .net

假设我有以下代码:

public class Base
{
    // Some stuff here
    public int var
}

public class UsingBase
{
    // Some more stuff here
    public Base B = new Base();
}

现在让我们说这些类的实际代码是巨大的,我希望UsingBase做一些额外的东西。所以我正在考虑对它进行子类化。现在让我们说我真正想做的是添加一个给我两次var的方法。由于var是Base的一个字段,因此将该方法添加到Base的子类而不是UsingBase的子类会更优雅。但我不想重写UsingBase,而UsingBase使用Base而不是我的Base的子类。实际上,这正是我想要做的事情:

TreeView(.NET)有一个名为Nodes的TreeNodeCollection类型的属性,它存储一组TreeNode类型的对象。节点中的每个TreeNode都可以有一个Tag,我可以使用它来存储我想要的任何对象。但是类TreeNodeCollection没有一个函数可以为我提供与某个Tag相对应的TreeNode。所以我希望能够做到这一点:

TreeView myTreeView = new TreeView();
// Add some TreeNode's and asign unique tags to each of them
TreeNode someNode = myTreeView.Nodes.GetNodeByTag(object Tag);

我知道我可以继承TreeView并添加一个能够做到这一点的函数,但我更喜欢其他解决方案。所以我想知道这是否可能。

2 个答案:

答案 0 :(得分:2)

由于TreeNodeCollection实现了IEnumerable,您只需使用LINQ where子句通过特定标记查找节点。

即。 :

TreeNode myTaggedNode =  myTreeView.Nodes.Cast<TreeNode>().Where(n=>n.Tag == myTag).SingleOrDefault()

我个人会避免在这种情况下进行子类化。

编辑:根据您的评论;您是否想知道是否可以使用您的树视图来使用包含GetNodeByTag(object tag)方法的TreeNodeCollection的子类型。有两种方法可以做到这一点(与我最初提出的解决方案相比,这两种方法都是过度解决方案)

方法1)子类TreeNodeCollection并包含您的GetNodeByTag(object tag)方法。然后将TreeView子类化为使用派生的TreeNodeCollection

这不起作用,因为TreeView上的Nodes属性不是虚拟的

方法2)在TreeNodeCollection上使用一个扩展方法,它包装我最初显示的linq表达式:

public static TreeNodeCollectionExtensions
{
    public static TreeNode GetNodeByTag(this TreeNodeCollection tnc, object tag)
    {
        return tnc.Cast<TreeNode>().Where(n=>n.Tag == tag).SingleOrDefault();        
    }

}

但同样,这只是包装我最初提供的原始linq表达式。

答案 1 :(得分:1)

如果你自己写这些课,那么是的,但是你不是,那就不一定了。

另一方面,你可以做的是为TreeNodeCollection写一个扩展方法,它会为你调用GetNodeByTag提供完全相同的语法。