Любой способ получить уведомление, когда что-то подписывается на событие / делегат? - PullRequest
7 голосов
/ 06 февраля 2012

Есть ли способ получить уведомление, когда что-то подписывается на событие в моем классе, или мне нужно заключить подписку / отписку в методы, например:

public class MyClass : ISomeInterface
{
     public event SomeEventHandler SomeEvent; //How do I know when something subscribes?

     private void OnSomeEventSubscription(SomeEventHandler handler)
     { 
          //do some work
     }

     private void OnSomeEventUnsubscription(SomeEventHandler handler)
     { 
          //do some work
     }
}

вместо

public class MyClass : ISomeInterface
{
     private SomeEventHandler _someEvent;

     public void SubscribeToSomeEvent(SomeEventHandler handler)
     {
          _someEvent += handler;

          //do some work
     }

     public void UnsubscribeFromSomeEvent(SomeEventHandler handler)
     {
          _someEvent -= handler;

          //do some work
     }    
}

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

Ответы [ 2 ]

10 голосов
/ 06 февраля 2012

Вы можете написать собственные методы доступа для вашего мероприятия:

private SomeEventHandler _someEvent;
public event SomeEventHandler SomeEvent
{
    add
    {
        _someEvent += value;
        Console.WriteLine("Someone subscribed to SomeEvent");
    }
    remove
    {
        _someEvent -= value;
        Console.WriteLine("Someone unsubscribed from SomeEvent");
    }
}
1 голос
/ 06 февраля 2012

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

    private readonly object _objectLock = new object(); 
    private SomeEventHandler _someEvent; 

    public event SomeEventHandler SomeEvent
    {
        add
        {      
            lock(_objectLock)
            {
                _someEvent += value;
                // do critical processing here, e.g. increment count, etc could also use Interlocked class.
            } // End if
        } // End of class
        remove
        {
            lock(_objectLock)
            {
                 _someEvent -= value;
                // do critical processing here, e.g. increment count, etc could also use Interlocked class.
            } // End if
        } // End if
    } // End of event
...