Сохраняет ссылку на объект в свойстве Tag элемента управления OK - PullRequest
1 голос
/ 13 октября 2010

Я создаю группу элементов управления формы для каждого объекта в списке. Можно ли сохранить ссылку на объект в свойстве 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;
     }
}

Это приемлемая вещь, чтобы сделать в этой ситуации, или есть лучший способ справиться с этим?

Ответы [ 2 ]

5 голосов
/ 13 октября 2010

Да, это допустимо и является одним из шаблонов, для которых было разработано свойство 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, но создает более надежный код (ИМХО).

1 голос
/ 13 октября 2010

Это приемлемо, если у вас работает. Я правильно сохранил вещи в теге, как это раньше, и он отлично работает. На что следует обратить внимание: размер объекта, который вы храните, и жизненный цикл объекта (он может быть утилизирован или уничтожен между доступами).

Другой подход, который я использовал, заключается в сохранении «подсказки», которая поможет вам восстановить или воссоздать объект. Например, если это объект базы данных, сохраните свойство Id (может быть, целое число или Guid), которое намного [потенциально] намного меньше, чем сам объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...