检查对事件方法的对象调用

本文关键字:对象 调用 方法 事件 检查 | 更新日期: 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语句很少是好事。以下是有关该主题的一些链接。

  1. 如何解释为什么开发人员应该避免case语句并创建一些新类
  2. 重构Switch语句
  3. 切换语句

更好的做法是为每个控件设置单独的事件处理程序,然后让它们在做相同的事情时调用相同的方法:

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检查的需要。