Получить делегатов событий базового класса по отражению - PullRequest
0 голосов
/ 26 августа 2018

Мне нужно получить всех делегатов, которые подписаны на события в объекте.Объект создается из класса, который наследует базовый класс.Я могу получить все делегаты для событий, определенных в классе, но не для базового класса.

Итак, в коде вот что у меня есть в принципе (я не копирую объявления, агрегации значений ивозвращает и т. д., чтобы сократить его):

public class DerivedClass : Base Class
{
    public event EventHandler<UserDefinedEventArgs> DerivedClassEvent;         
}

Базовый класс определяется следующим образом (содержит функции для получения необходимых мне делегатов):

public abstract class BaseClass 
{
    public event EventHandler<UserDefinedEventArgs> BaseClassEvent;

    public Dictionary<EventInfo, List<Delegate>> getAllEventsSubscribersList()
    {

        EventInfo[] eventInfoS = this.GetType().GetEvents(); //Get all events / event infos defined in the class

        foreach (EventInfo eventInfo in eventInfoS)
        {
            resDelegates = this.getEventSubscriberList(eventInfo); //Get the delegates for each event
        }
    }

    public List<Delegate> getEventSubscriberList(EventInfo eventInfo)
    {
        FieldInfo eventFieldInfo = this.GetType().GetField(eventInfo.Name, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy);

        Delegate eventFieldValue = (System.Delegate)eventFieldInfo.GetValue(this);

        Delegate[] subscribedDelegates = eventFieldValue.GetInvocationList();
    }
}

Затем я пытаюсьчтобы получить все события и их делегаты следующим образом:

DerivedClass myObject = new DerivedClass();
Dictionary<EventInfo, List<Delegate>> EventAndDelegatesList = myObject.getAllEventsSubscribersList();

При вызове getAllEventsSubscribeersList все события как производного, так и базового класса будут найдены правильно.Но в функции для получения фактических делегатов FieldInfo для 'BaseClassEvent' всегда равен 'null'.

Как я могу прочитать делегаты для события базового класса?

1 Ответ

0 голосов
/ 27 августа 2018

Событие похоже на автоматически реализованное свойство для делегата.Вы также можете объявить это явно.Это позволит вам вставить обработчик событий в коллекцию по вашему выбору

public event EventHandler<UserDefinedEventArgs> DerivedClassEvent
{
    add
    {
        // TODO: add the event handler to a collection and subscribe it to a hidden delegate.
    }
    remove
    {
        // TODO: remove the event handler from the collection and unsubscribe it.
    }
}

См. Также

...