Принудительная обработка событий - PullRequest
6 голосов
/ 31 мая 2011

Есть ли способ выполнить принудительное выполнение компиляции при обработке событий?

Так, например, скажем, у меня есть класс, который предоставляет стандарт EventHandler<T> Могу ли я убедиться, что любые экземпляры этого класса имеютобработчик OnMyEvent, обработано?(Желательно во время компиляции)

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

Кроме того, если C # не поддерживает эту функцию;из любопытства делают еще какие-нибудь языки?

1 Ответ

3 голосов
/ 31 мая 2011

События: обычно предназначены для необязательно потребления по вызывающему коду объекта - например, в качестве наблюдателя (или нескольких наблюдателей). Очень редко, когда обработка события принудительно . Не существует стандартной конструкции языка / компилятора для проверки подписки на событие во время компиляции (и я подозреваю, что это будет очень сложно, так как вы можете достоверно подписаться / отписаться в любое время, в любом месте кода - возможно, несколько раз, т.е. + HandlerA, + HandlerB, -HandlerA, -HandlerB - который заканчивается без подписчиков).

В представленном вами сценарии, где требуется , тогда передача его в конструктор звучит более уместно, но я бы, вероятно, использовал Func<...> или Action<...> в этом случае (не * 1015) *). Но это субъективно.

Другие подходы:

  • делает его абстрактным классом и заставляет потребителя создавать подклассы и override один или более abstract членов
  • имеет параметр interface, который потребитель должен предоставить
...