我注意到了标记属性与控件。使用它来引用我的自定义对象可以吗,或者应该避免使用它,因为这会涉及到装箱和拆箱,这被认为是不安全的并且不推荐使用。
TreeNode tn = new TreeNode();
CustClass o = new CustClass()
o.number = 123;
tn.Tag = o;
class CustClass
{
public int number {get; set;}
}
我注意到了标记属性与控件。使用它来引用我的自定义对象可以吗,或者应该避免使用它,因为这会涉及到装箱和拆箱,这被认为是不安全的并且不推荐使用。
TreeNode tn = new TreeNode();
CustClass o = new CustClass()
o.number = 123;
tn.Tag = o;
class CustClass
{
public int number {get; set;}
}
Tag
属性的目的是让您将其用于任何想要的目的。 您可以安全地在其中存储任何内容。Tag
属性中的类(就像您使用 CustClass
一样)。 但是,如果您只需要一个值,则直接将 int
存储在其中是没有问题的。object
时才会装箱值类型。Control.Tag
属性,以了解如何使用此属性。以下是其他人提到的链接:
在https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.tag.aspx中,可以看到:
任何从 Object 类派生的类型都可以分配给此属性。如果通过 Windows Forms 设计器设置 Tag 属性,则只能分配文本。
tag 属性的常见用法是存储与控件密切相关的数据。例如,如果您有一个显示有关客户信息的控件,则可以将包含客户订单历史记录的 DataSet 存储在该控件的 tag 属性中,以便可以快速访问数据。
而在https://msdn.microsoft.com/zh-cn/library/system.windows.forms.treenode.tag.aspx中,可以看到:
...示例创建根树节点以分配子树节点。将 ArrayList 中每个 Customer 对象的子树节点添加到根树节点中,以及为分配给 Customer 对象的每个 Order 对象添加一个子树节点。Customer 对象分配给 Tag 属性,并显示表示 Customer 对象的树节点的橙色文本。此示例要求定义 Customer 和 Order 对象,一个 Form 上的 TreeView 控件以及一个名为 customerArray 的包含 Customer 对象的 ArrayList。
你可以创建自己的继承自TreeNode的类:
class MyNode : TreeNode {
public int number {get; set;}
}
但是当您从树中检索节点时,您将进行强制转换,这与强制转换标记属性没有任何改进。而且您应该重写Clone()方法。
更清晰的方法是利用TreeNode.Name,并将其作为字典中的键来查找您的自定义数据。当CustClass变得非常复杂时,这种方法很好。Name属性不用于其他任何事情。