C# Delegate with Generic T 作为按钮
C# Delegate with Generic T as Button
我正在想办法解决这个问题。我正在开发一个大型 windows 应用程序,该应用程序需要主窗体中的所有控件近乎实时地更新它们的值。我将这个连续方法的处理移到了它自己的线程中,这通常很好,但我知道它需要我创建一个委托来设置我在不同线程中创建的控件。但是,我有一系列按钮,需要为每个按钮设置相同的各种属性,但具有不同的值。我在想我可以设置一个 Delegate,其泛型类型为 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]);
如果可行,或者有更好的方法,请随时详细告诉我。 (如果我可以在 Button 上使用它,我也会为其他控件类型创建另一个委托)
提前致谢。
类型就是……一种类型。你不能调用它的实例,因为你没有实例。它只是反映元数据。
您需要将按钮实例传递给您的方法。
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
}
我正在想办法解决这个问题。我正在开发一个大型 windows 应用程序,该应用程序需要主窗体中的所有控件近乎实时地更新它们的值。我将这个连续方法的处理移到了它自己的线程中,这通常很好,但我知道它需要我创建一个委托来设置我在不同线程中创建的控件。但是,我有一系列按钮,需要为每个按钮设置相同的各种属性,但具有不同的值。我在想我可以设置一个 Delegate,其泛型类型为 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]);
如果可行,或者有更好的方法,请随时详细告诉我。 (如果我可以在 Button 上使用它,我也会为其他控件类型创建另一个委托)
提前致谢。
类型就是……一种类型。你不能调用它的实例,因为你没有实例。它只是反映元数据。
您需要将按钮实例传递给您的方法。
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
}