Делегирование C # с помощью универсального T как кнопки

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