コントロール付きのタグプロパティに気づきました。これを使用してカスタムオブジェクトを参照することは問題ありませんか、それとも、安全でないと言われ、推奨されていないボックス化とボックス化解除が必要になるため、使用しないでください。
TreeNode tn = new TreeNode ();
CustClass o = new CustClass()
o.number = 123;
tn.Tag = o;
class CustClass
{
public int number {get; set;}
}
Tag
プロパティの目的は、任意の目的で使用することです。何でも安全に保管できます。
Tag
プロパティに格納することを特に目的としたクラスを宣言するのが通例です(CustClass
で行ったように)。ただし、値が1つだけ必要な場合は、int
を直接格納しても問題はありません。
ボクシング/開封は「安全ではない」とどこで読みましたか?それは絶対に真実ではありません。 (一部の人々はそれが非効率的であると主張しますが、それでも真実ではありません。)さらに、あなたのコードにはボクシングの例すら含まれていません。 CustClass
は参照型です。 object
に割り当てられると、値タイプのみがボックス化されます。
私はこれがあなたが望むようにそれを使用するためのボクシングまたはボックス化解除の問題になるとは思わない。私の知る限り、そのTagプロパティはプログラマーの目的にのみ使用されるため、必要な方法で使用できます。
参照してください - Control.Tag
このプロパティの使用方法の詳細については、MSDNのプロパティ。
たとえば、私はこれを使用して、Windowsフォームアプリケーションでユーザーに指示を入力していました。コントロールのGotFocusイベントがトリガーされると、命令のLabel.Textプロパティに、命令文字列を含むコントロールのTagプロパティの値が割り当てられました。
ここで他の人も言及しているリンクから:
https://msdn.Microsoft.com/en-us/library/system.windows.forms.control.tag.aspx 次のように読みます。
Objectクラスから派生した任意の型を、このプロパティに割り当てることができます。タグプロパティがWindowsフォームデザイナで設定されている場合、テキストのみを割り当てることができます。
Tagプロパティの一般的な使用法は、コントロールに密接に関連付けられているデータを格納することです。たとえば、顧客に関する情報を表示するコントロールがある場合、データにすばやくアクセスできるように、顧客の注文履歴を含むDataSetをそのコントロールのTagプロパティに保存できます。
そして https://msdn.Microsoft.com/en-us/library/system.windows.forms.treenode.tag.aspx で:
... exampleは、子ツリーノードを割り当てるルートツリーノードを作成します。 ArrayList内の各Customerオブジェクトの子ツリーノードがルートツリーノードに追加され、Customerオブジェクトに割り当てられた各Orderオブジェクトの子ツリーノードも追加されます。 CustomerオブジェクトはTagプロパティに割り当てられ、Customerオブジェクトを表すツリーノードはオレンジ色のテキストで表示されます。この例では、CustomerオブジェクトとOrderオブジェクトが定義されていること、フォームのTreeViewコントロール、およびCustomerオブジェクトを含むcustomerArrayという名前のArrayListが必要です。
さて、あなたはあなた自身のTreeNode派生クラスを作成することができます:
class MyNode : TreeNode {
public int number {get; set;}
}
ただし、ツリーからノードを取得するときにキャストすることになり、Tagプロパティのキャストよりも改善はありません。そして、Clone()メソッドをオーバーライドする必要があります。
よりクリーンなアプローチは、TreeNode.Nameを活用し、それを辞書のキーにしてカスタムデータを見つけることです。 CustClassが自明ではなくなったときに適しています。 Nameプロパティは、他の目的には使用されません。