将对象引用存储在控件Tag属性中

Tes*_*101 1 c# object winforms

我正在为列表中的每个对象创建一组表单控件,是否可以在控件Tag属性中存储对象的引用?

我这样做,所以我可以在控件上有一个通用的Click事件,所以当它们被点击时,我可以更新它们所代表的对象中的一个字段.

所以点击处理程序看起来像这样.

private void Item_Clicked(object sender, system.EventArgs e)
{
     if(sender.GetType() == typeof(System.Windows.Forms.Label))
     {
          System.Windows.Forms.Label label = (System.Windows.Forms.Label)sender;
          MyObject myObject = label.Tag;
          myObject.Value = true;
     }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这是可以接受的吗,还是有更好的方法来处理这个问题?

Jar*_*Par 5

是的,这是合法的,是Tag财产设计的模式之一.

这里最大的危险是另一个代码尝试使用相同的Tag属性来实现自己的功能.这将为Tag属性创建竞争并导致运行时错误.更安全的方法是在a LabelMyObject使用Dictionary实例之间创建私有映射.

private Dictionary<Label,MyObject> _map = new Dictionary<Label,MyObject>();
...
private void Item_Clicked(object sender, system.EventArgs e) 
{ 
     if(sender.GetType() == typeof(System.Windows.Forms.Label)) 
     { 
          System.Windows.Forms.Label label = (System.Windows.Forms.Label)sender;
          MyObject myObject = _map[label];
          myObject.Value = true; 
     } 
}
Run Code Online (Sandbox Code Playgroud)

这种方法具有额外的开销,Dictionary但产生更可靠的代码(恕我直言).