C# 将同一处理程序分配给多个事件的紧凑方式

C# 将同一处理程序分配给多个事件的紧凑方式,c#,winforms,events,code-duplication,C#,Winforms,Events,Code Duplication,在我的用户控制代码中,我注意到许多事件都使用相同的处理程序: btnMas.MouseDown += MyMouseDown; btnMenos.MouseDown += MyMouseDown; txtValue.MouseDown += MyMouseDown; lblMax.MouseDown += MyMouseDown; lblMin.MouseDown += MyMouseDown; lblName.MouseDown += MyMouseDown; 有没有更简洁的方法来写这个?与

在我的用户控制代码中,我注意到许多事件都使用相同的处理程序:

btnMas.MouseDown += MyMouseDown;
btnMenos.MouseDown += MyMouseDown;
txtValue.MouseDown += MyMouseDown;
lblMax.MouseDown += MyMouseDown;
lblMin.MouseDown += MyMouseDown;
lblName.MouseDown += MyMouseDown;

有没有更简洁的方法来写这个?与迭代事件集合或使用lambdas?

一样,如果在许多对象上订阅同一事件,并且该事件由某个基类公开,则可以使用:

var controls = new Control[] { btnMas, btnMenos, txtValue,
                               lblMax, lblMin, lblName };
foreach (var control in controls)
{
    control.MouseDown += MyMouseDown;
}
请注意,我不确定那是否真的更干净。当然,如果您需要对同一组控件执行多个不同的操作,它会变得更干净

编辑:考虑到额外的信息,它实际上非常简单:

foreach (Control control in this.Controls)
{
    control.MouseDown += MyMouseDown;
}

如果在许多对象上订阅同一事件,并且该事件由某个基类公开,则可以使用:

var controls = new Control[] { btnMas, btnMenos, txtValue,
                               lblMax, lblMin, lblName };
foreach (var control in controls)
{
    control.MouseDown += MyMouseDown;
}
请注意,我不确定那是否真的更干净。当然,如果您需要对同一组控件执行多个不同的操作,它会变得更干净

编辑:考虑到额外的信息,它实际上非常简单:

foreach (Control control in this.Controls)
{
    control.MouseDown += MyMouseDown;
}
如果要特别选择控件,可以在扩展中使用此

public static bool In<T>(this T obj, params T[] values)
{
    for (int i=0; i < values.Length; i++)
    {
         if (object.Equals(obj, values[i]))
             return true;
    }
    return false;
}
如果要特别选择控件,可以在
扩展中使用此

public static bool In<T>(this T obj, params T[] values)
{
    for (int i=0; i < values.Length; i++)
    {
         if (object.Equals(obj, values[i]))
             return true;
    }
    return false;
}

值得注意的是,如果这些组意味着什么,并且您发现自己在控件集合上执行了一些类似这样的操作,那么您应该为变量指定一个名称,以反映控件组所代表的内容。实际上,它们都是我的用户控件的组件。现在我想了想,我可以使用
this.Controls
,无需创建另一个集合。就像罗伯特·哈维的回答一样。@dario_ramos:那么,这些控件都是
中的控件,还是仅仅是选定的控件?@Jon Skeet:在这种情况下,它们都是这些控件。值得注意的是,如果这些组有意义,你会发现自己在控件集合上做了一些操作,比如你应该给变量一个名称,这个名称反映了控件组所代表的内容。实际上,它们都是我的用户控件的组件。现在我想了想,我可以使用
this.Controls
,无需创建另一个集合。就像罗伯特·哈维的回答一样。@dario_ramos:那么它们都是
这个控件中的控件,还是仅仅是选定的控件?@Jon Skeet:在这种情况下,它们都是+1,如果我想排除或包含特定控件+1,这很好,如果我想排除或包含特定控件,这很好