假设我有以下代码:
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并添加一个能够做到这一点的函数,但我更喜欢其他解决方案。所以我想知道这是否可能。
答案 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提供完全相同的语法。