使用通用 T 作为按钮的 C# 委托(delegate)

标签 c# generics delegates

我试图弄清楚这个问题,简直快疯了。我正在开发一个大型 Windows 应用程序,需要主窗体中的所有控件近乎实时地更新其值。我将这个连续方法的处理移到了它自己的线程中,这通常很好,但我知道它需要我创建一个委托(delegate)来设置在不同线程中创建的控件。但是,我有一系列按钮,需要为每个按钮设置相同的各种属性,但具有不同的值。我想我可以设置一个通用类型为 Button 的委托(delegate),这样我就可以在需要更新其属性时简单地传递正确的按钮控件。但我错过了一些东西,而且它不起作用:

//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]);

如果这是可能的,或者有更好的方法,请随时详细告诉我。 (如果我可以在按钮上使用它,我也会为其他控件类型创建另一个委托(delegate))

提前致谢。

最佳答案

类型就是……类型。您无法调用它的实例,因为您没有实例。它只是反射(reflect)的元数据。

您需要将按钮的实例传递给您的方法。

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
}

关于使用通用 T 作为按钮的 C# 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65636319/

相关文章:

c# - 如何在不存在的行中找到 JavaScript 严重错误?

c# - 如何使用 ExcelLibrary 更改 Excel 文件中的单元格样式?

generics - 如何从处理未知类型的多个来源安全地加载代码?

java - 我如何从java中的泛型类继承?

c# - Dispatcher.BeginInvoke ,尝试使用 lambda 从文本 block 获取字符串集,但出现转换错误

c# - 使用自定义委托(delegate)在当前类上注册事件的处理程序

c# - 更改 WPF 数据网格中自动生成的列类型

c# - 合并 DBContext 和 IdentityDbContext

.net - ConcurrentQueue(Of T) 的元素无法加宽

swift - 在 Swift 中,我如何拥有一个具有内部和外部委托(delegate)的 UIScrollView 子类?