我正在为列表中的每个对象创建一组表单控件,是否可以在控件的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;
     }
}


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

最佳答案

是的,这样做是合法的,并且是Tag属性设计的模式之一。

这里最大的危险是另一段代码试图将相同的Tag属性用于其自身功能。这将导致Tag属性的争用并导致运行时错误。一种更安全的方法是使用Label实例在MyObjectDictionary之间创建私有映射。

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;
     }
}


这种方法具有Dictionary的额外开销,但会产生更可靠的代码(IMHO)。

关于c# - 正在将对象引用存储在控件的Tag属性中,确定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3927067/

10-11 18:50