В .NET возможно ли устанавливать события на основе вызова функции - PullRequest
4 голосов
/ 30 марта 2011

Скажем, у меня есть функция с именем:

void AFun()
{
// body
}

Можно ли установить событие всякий раз, когда вызывается эта функция.Скажем,

void AnEvent()
{
//body
}

И AnEvent() всегда будет вызываться всякий раз, когда вызывается AFun().

Ответы [ 4 ]

4 голосов
/ 30 марта 2011

Да, но косвенно, если вы отправляете событие в AFun, и AnEvent будет прослушивать это событие, и вы достигнете желаемого.В противном случае то, что вы описываете, не поддерживается напрямую

Пример кода:

public delegate void EventHandler();
public event EventHandler ev;

public void AFun
{
   ...do stuff
   ev(); //emit
}

//somewhere in the ctor
ev += MyEventHandler;

//finally 

void MyEventHandler
{
    //handle the event
}
1 голос
/ 30 марта 2011

Не так, как вы пишете. То, что вы описываете, называется «Аспектно-ориентированным программированием» (AOP) и требует поддержки компилятора.

Теперь есть некоторые расширения для C # и .NET, которые выполняют AOP, внедряя слушателей и события в нужные места в коде.

Не по теме: в JavaScript вы можете сделать это.

1 голос
/ 30 марта 2011

Простой способ:

event EventHandler AnEventHappened;

void AFun()
{
   OnAnEvent();
}

void AnEvent()
{

}

void OnAnEvent()
{
  var tmp = AnEventHappened;
  if(tmp != null) tmp(this, EventArgs.Empty);
}
0 голосов
/ 30 марта 2011

Hard Way:

Используйте Аспектно-ориентированное программирование (с чем-то вроде Castle или PostSharp) и отправляйте событие таким образом.

...