检查对事件方法的对象调用
本文关键字:对象 调用 方法 事件 检查 | 更新日期: 2023-09-27 18:20:44
我有ComboBox,每个ComboBox都有其SelectedIndexChanged事件。我不想写每个组合框的事件,但我想写一个事件方法,检查哪个组合框调用一个事件,并让控件为每个组合框做特定的方法。我搜索并写道:
private void eventmethod(object sender, EventArgs s)
{
ComboBox cb = sender as ComboBox;
if (cb != null & cb.Name.Equals("combobox1"))
{
method1();
}
else if (cb != null & cb.Name.Equals("combobox2"))
{
method2();
}
}
有没有更有效的检查方法?
这种方法打破了单一责任原则(SRP),除非每个ComboBox.SelectedIndexChanged事件都这样做。
最好为每个控件都有一个事件处理程序,这样可以很容易地分离特定的行为。如果为每个ComboBox指定了特定的行为,并且它们也有共同的行为,则使用helper方法来执行共同的任务。
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
doesCommonTasksToBePerformedThroughAHelperMethod();
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) {
// Does specific tasks
doesCommonTasksToBePerformedThroughAHelperMethod();
}
private void doesCommonTasksToBePerformedThroughAHelperMethod() {
// Perform common tasks
}
这是最好的做法。
否则,请检查控件本身。
var cb = sender as ComboBox;
if (cb == null) return;
switch(cb) {
case cb.Equals(comboBox1):
// Do something
break;
case cb.Equals(comboBox2):
// Do something
break;
}
switch语句很少是好事。以下是有关该主题的一些链接。
- 如何解释为什么开发人员应该避免case语句并创建一些新类
- 重构Switch语句
- 切换语句
更好的做法是为每个控件设置单独的事件处理程序,然后让它们在做相同的事情时调用相同的方法:
void combo1_OnChange(object sender, EventArgs e)
{
CommonMethod();
}
void combo2_OnChange(object sender, EventArgs e)
{
CommonMethod();
}
在您的情况下,它们不做相同的事情,因此有单独的处理程序更有意义:
void combo1_OnChange(object sender, EventArgs e)
{
Method1();
}
void combo2_OnChange(object sender, EventArgs e)
{
Method2();
}
这个规则的一个例外是,如果您正在动态创建控件,但即使这样,您也可能会使用委托。
无需多次检查null,只需检查一次,如果发现则返回。也不需要检查名称,因为您只需检查控件ie组合框即可。因为您正在调用不同的方法,所以让多个控件指向此事件并没有害处。我还会用try-catch语句来包围它。
private void eventmethod(object sender, EventArgs s)
{
ComboBox cb = sender as ComboBox;
//check for null once and return if found
if(cb == null) return;
//no need to call for the name just check for the combobox
//assuming the name of the control is combobox1 and combobox2
if (cb.Equals(combobox1))
{
method1();
}
else if (cb.Equals(combobox2))
{
method2();
}
}
您可以使用switch语句:
private void eventmethod(object sender, EventArgs s)
{
ComboBox cb = sender as ComboBox;
if (cb == null) return;
switch (cb.Name)
{
case "combobox1":
method1();
break;
case "combobox2":
method2();
break;
}
}
这不一定是最好的方法,但它确实消除了对多个null检查的需要。