Присвоение статическим событиям значения null с помощью отражения

#c# #.net #events #reflection #static

#c# #.net #Мероприятия #отражение #статический

Вопрос:

У меня следующая проблема:

Я получил класс с ~ 100 статическими событиями, и я хочу установить для всех этих событий значение null (удаление всех делегатов) при утилизации. Могу ли я сделать это с помощью отражения? потому что в противном случае было бы много писать и трудно синхронизировать изменения.

Я пробовал что-то вроде этого:

 foreach (EventInfo eventInfo in GetType().GetEvents(BindingFlags.Static | BindingFlags.Public))
     {
        // ?
     }
  

но я не знаю, как установить для них значение null. Я думаю, это не работает с отражением, может быть, это еще один простой способ?

Br, Дэвид

Комментарии:

1. Я не понимаю. Почему удаление экземпляра должно обнулять все статические события?

2. Реализованы ли эти события автоматически?

Ответ №1:

Следующее должно сработать:

    foreach (EventInfo eventInfo in GetType().GetEvents(BindingFlags.Static | BindingFlags.Public))
   {
      FieldInfo field = GetType().GetField(eventInfo.Name, BindingFlags.Static | BindingFlags.NonPublic);
      field.SetValue(null, null);             
   }
  

Конечно, при условии, что для событий действительно есть резервные поля, в противном случае их невозможно «установить».

Ответ №2:

Вы не можете «устанавливать» события, единственными доступными операциями являются добавление или удаление определенного делегата.

Однако вы можете установить поле поддержки. Обратите внимание, что не обязательно соответствие 1: 1 между событиями и полями — WinForms использует словарь делегатов, чтобы избежать потери места для событий без обработчиков.