Как вызвать событие автоматически, когда функция вызвана?

У меня есть этот вид кода:

public class Foo
{
  public SomeHandler OnBar;

  public virtual void Bar()
  {
  }
}

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

5
задан the_drow 11 July 2010 в 15:24
поделиться

4 ответа

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

public class Foo
{
    public SomeHandler OnBar;

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

    protected virtual void BarImpl()
    {
    }
}
9
ответ дан 18 December 2019 в 16:34
поделиться

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

Учитывая это, посмотрите на "аспектно-ориентированное программирование" в .NET. Погуглите, возможно, вы почерпнете что-то полезное.

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

2
ответ дан 18 December 2019 в 16:34
поделиться

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

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

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

0
ответ дан 18 December 2019 в 16:34
поделиться

во-первых, код, который вы предоставили, не скомпилируется.
виртуальные функции должны иметь тело.

Чтобы убедиться, что событие сработало, вы можете сделать что-то вроде этого.

public class Foo
{
  public SomeHandler OnBar;

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

  protected virtual ProtectedBar()
  {
  }
}
1
ответ дан 18 December 2019 в 16:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: