#c# #generics #delegates
#c# #общие #делегаты
Вопрос:
Я схожу с ума, пытаясь разобраться в этом. Я разрабатываю большое приложение для Windows, которое требует, чтобы все элементы управления в основной форме обновлялись в режиме реального времени. Я перенес обработку этого непрерывного метода в его собственный поток, что в целом нормально, но я знал, что мне требуется создать делегат для настройки моих элементов управления, которые были созданы в другом потоке. Однако у меня есть ряд кнопок, для каждой из которых должны быть установлены одинаковые различные свойства, но с разными значениями. Я думал, что мог бы настроить делегат с общим типом Button, чтобы я мог просто передать соответствующий элемент управления button, когда пришло время обновить его свойства. Но я что-то упускаю, и это не работает:
//If this is wrong, please let me know
private delegate void SafeButtonText<T>(string value) where T : Button;
private void SetButtonTextSafe<T>(string value) where T : Button
{
//Using the generic Button passed in, set its values
if (T.InvokeRequired) //This doesn't compile
{
var d = new SafeButtonText<T>(SetButtonTextSafe<T>);
T.Invoke(d, new object[] { value }); //This doesn't compile
}
else
T.Text = value; //This doesn't compile
}
Я думал, что смогу использовать его так (что кажется невозможным)
SetButtonTextSafe<qualityButton>(values[0]);
Если это возможно, или если есть гораздо лучший способ сделать это, пожалуйста, не стесняйтесь рассказать мне подробно. (если я смогу использовать это на кнопке, я бы создал еще один делегат и для других типов элементов управления)
Заранее спасибо.
Комментарии:
1. Что это за фреймворк пользовательского интерфейса? Winforms?
Ответ №1:
Тип — это просто … тип. Вы не можете вызвать его экземпляр, потому что у вас нет экземпляра. Это просто отраженные метаданные.
Вам нужно передать экземпляр вашей кнопки вашему методу.
private delegate void SafeButtonText<T>(T button, string value) where T : Button;
private void SetButtonTextSafe<T>(T button, string value) where T : Button
{
//Using the generic Button passed in, set its values
if (button.InvokeRequired) //This now compiles
{
var d = new SafeButtonText<T>(SetButtonTextSafe<T>);
button.Invoke(d, new object[] { value }); //This now compiles
}
else
button.Text = value; //This now compiles
}