在 C# 中引用表单对象以避免重复代码块

Reference form objects in C# to avoid repeating code blocks

我试过搜索这个,但我的问题可能是我不知道描述问题的正确术语。

我有一个 C# 窗体,其中包含许多文本框对象。

有时我会按如下顺序处理每个文本框的内容:

tbxStressCmd1.BackColor = Color.Salmon;
processCmd(tbxStressCmd1.Text);
System.Threading.Thread.Sleep( tbxStressWait1.text );
tbxStressCmd1.BackColor = Color.White;

tbxStressCmd2.BackColor = Color.Salmon;
processCmd(tbxStressCmd2.Text);
System.Threading.Thread.Sleep( tbxStressWait2.text );
tbxStressCmd1.BackColor = Color.White;
.
tbxStressCmd9.BackColor = Color.Salmon;
processCmd(tbxStressCmd9.Text);
System.Threading.Thread.Sleep( tbxStressWait9.text );
tbxStressCmd9.BackColor = Color.White;

我想避免重复并有类似的东西:

// Pseudo Code
runCmd ( object tbxCmd, object tbxWait )
{
   tbxCmd.BackColor = Color.Salmon;
   processCmd(tbxCmd.Text);
   System.Threading.Thread.Sleep( tbxWait.text );
   tbxCmd.BackColor = Color.White;
}

然后:

runCmd( tbxStressCmd1, tbxStressWait1 );
.
.
runCmd( tbxStressCmd9, tbxStressWait9 );

引用文本框对象以便将它们传递给函数并像上面的伪代码那样使用的正确方法是什么?

您正在将 TextBox 类型的变量作为 object 传递给该方法,您没有传递实际类型。我想,这里是 TextBox。如果不传递实际类型,则无法操作该类型的属性。您只会看到并处理该类型,就好像它是您用来传递参数的类型,这里是 Object 因为 TextBox 派生自基础 class Object。你可以看看 Object class 成员。你在那里看不到 Text 属性 :)。 你可以这样做:

public void DoTheThing(TextBox txCmd, TextBox txWait){
    txCmd.BackColor = Color.Salmon;
    ProcessCmd(txCmd.Text);
    System.Threading.Thread.Sleep(txWait.Text)
    txCmd.BackColor = Color.White;
}

我想用一些笔记来结束:

  1. 首先你不能传递一个字符串值给 System.Threading.Thread.Sleep。你应该做一些叫做 castingtype conversion。您可以搜索这些术语。到 做到这一点,C# 为您提供帮手 class Convert。您可以使用辅助方法 ToInt32TextBox 中的值转换为 Int32 值类型。

  2. 如果要实现“等待”或“延迟”效果,请在 UI 应用程序或 UI-Thread 上下文中。我建议您改用 Task.Delay ,返回的延迟任务 await ,并用 async 修饰符标记您的方法。这叫做Asynchronous Programming