2012-09-22 2 views
0

Я бы передал контроль над своей формой в другой класс, где я буду создавать события для элемента управления, его родительского элемента управления и т. Д. Мне также необходимо отделить эти события в какой-то момент. Но мне нужно убедиться, что я не буду дублировать события, если событие уже подключено.Есть ли способ реорганизации событий, связанных с отдельным статическим методом?

Так что я всегда присоединять события, как это, например, для:

internal static void X(Control c, MouseEventHandler mouseDownEvent) 
{ 
    c.TopLevelControl.MouseDown -= mouseDownEvent; 
    c.TopLevelControl.MouseDown += mouseDownEvent; 
} 

Теперь я должен был бы подобный случай крепления для других обработчиков тоже. Для, например,

internal static void X(Control c, EventHandler event) 
{ 
    c.Enter -= event; 
    c.Enter += event; 
} 

Теперь я не хочу, чтобы распылить вокруг этого -= и += все вокруг, а не хотели бы иметь одну простую функцию полезности, так что я могу назвать его везде.

Что-то вроде:

internal static void AttachEvent(this Control c, 
           Func<Control, MouseEventHandler> e, 
           MouseEventHandler m) 
{ 
    e(c) -= m; 
    e(c) += m; 
} 

Так что я могу назвать:

AttachEvent(c, control => control.MouseDown, mouseDownEvent); 

Но это не компилируется, я получаю две ошибки:

The event 'System.Windows.Forms.Control.MouseDown' can only appear on the left hand side of += or -=

и

The left-hand side of an assignment must be a variable, property or indexer

Я хотел бы иметь AttachEvent принимать какое-либо событие в качестве входного аргумента, но если это слишком сложно, я могу жить с одними MouseEvents.

+1

Зачем вам удалять обработчик, чтобы добавить его снова сразу же после его удаления? – zeebonk

+0

@zeebonk Чтобы удалить существующий обработчик (во избежание дублирования). Если я не удаляю, может быть больше обработчиков для события, которое будет делать те же самые taks несколько раз – nawfal

ответ

1

Я думаю, что это невозможно. Событие в C# - как свойство - состоит из двух методов: добавление и удаление. Так, если развернуть события в двух методах в уме

e.add_MouseOver(Delegate) 
e.remove_MouseOver(Delegate) 

вы увидите, что это невозможно передать ссылку на событие и сделать что-то с ним в другом методе.

Также + = является частью синтаксиса C# и работает только со ссылкой на событие в левой части выражения.

Смежные вопросы