Вы можете передать имя события в виде строки, а затем использовать Reflection для реализации этого, но это было бы довольно уродливо (и медленно).К сожалению, нет другого способа передать события в качестве аргументов методу.
Однако вы можете написать это элегантно, используя лямбда-функции.Вместо того, чтобы писать функцию для добавления обработчика, вы можете написать функцию, которая вызывает лямбда-выражение для каждого элемента управления:
private void TraverseControls(Control control, Action<Control> f)
{
f(control);
foreach (Control subControl in control.Controls)
TraverseControls(subControl, f);
}
Затем вы можете решить исходную проблему, используя один вызов:
TraverseControls(form, ctl => {
ctl.MouseDown += handler;
ctl.MouseUp += handler); });
Лямбда-выражение ctl => { .. }
будет вызываться для каждого элемента управления в дереве, а внутри лямбда-выражения можно добавлять обработчики для любых событий элемента управления.Вы также можете написать это, используя два вызова (добавив обработчики к MouseDown
в первом и к MouseUp
во втором).
По сравнению с решением, использующим Reflection, это быстрее и безопаснее.