我正在为列表中的每个对象创建一组表单控件,是否可以在控件的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
实例在MyObject
和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;
}
}
这种方法具有
Dictionary
的额外开销,但会产生更可靠的代码(IMHO)。关于c# - 正在将对象引用存储在控件的Tag属性中,确定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3927067/