Как вызвать событие автоматически при вызове функции? - PullRequest
5 голосов
/ 11 июля 2010

У меня есть такой код:

public class Foo
{
  public SomeHandler OnBar;

  public virtual void Bar()
  {
  }
}

Foo является базовым классом, и поэтому другие классы могут наследовать его.
Я бы хотел, чтобы событие OnBar всегда вызывалось, когда Bar() вызывается, даже если он не вызывается явно внутри бара.
Как это можно сделать?

Ответы [ 4 ]

9 голосов
/ 11 июля 2010

Распространенным шаблоном является наличие не виртуального метода, который будет выполнять то, что вы хотите, который вызывает виртуальный метод.Подклассы могут переопределить внутренний метод, чтобы изменить функциональность, но открытый метод может быть не виртуальным, всегда вызывая событие первым.

public class Foo
{
    public SomeHandler OnBar;

    public void Bar()
    {
        if (OnBar != null)
        {
            OnBar(this, EventArgs.Empty);
        }
        BarImpl();
    }

    protected virtual void BarImpl()
    {
    }
}
2 голосов
/ 11 июля 2010

Краткий ответ: вы не можете.Не с тем, что Microsoft дает вам из коробки.

Тем не менее, взгляните на «аспектно-ориентированное программирование» в .NET.Google, что, вы можете получить что-то полезное.

Добавлено: Стандартным способом было бы вызвать событие в методе Bar() и затем потребовать от всех производных классов вызвать базовую реализацию.Но вы не можете применить это.

1 голос
/ 11 июля 2010

прежде всего предоставленный вами код не будет компилироваться.
Виртуальные функции должны иметь тело.

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

public class Foo
{
  public SomeHandler OnBar;

  public void Bar()
  {
     OnBar();  (check for nulls)
     ProtectedBar();
  }

  protected virtual ProtectedBar()
  {
  }
}
0 голосов
/ 11 июля 2010

Как сказал Вилкс, я думаю, что лучший способ сделать это - использовать Аспектно-ориентированное программирование.

Это поможет вам с «запутанным кодом» (т. Е. Вызовом события в методе, который не должен нести эту ответственность) и «разбросанным кодом» (т. Е. Вызовом одного и того же события во многих методах, дублируя ваш код) проблемы.

Вы должны взглянуть на postsharp , у него есть бесплатная версия сообщества.

...