#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 использует словарь делегатов, чтобы избежать потери места для событий без обработчиков.