Ответ 1
Это причуда С#, она не поддерживает функции повышения доступа. Добавляйте и удаляйте. Другие языки .NET, такие как VB.NET, F # и С++/CLI, поддерживают их, и они хорошо определены в спецификации CLI с именем "fire" в этом.
Трудно объяснить, почему команда С# пропустила его, я никогда не видел для этого хорошего объяснения. Чистая спекуляция: возможно, это связано с их желанием избежать затрат на построение аргументов события для события, которое никто не подписывал. Очень часто в графических интерфейсах. Это немного потеря, сотни тысяч часов, должно быть, были потеряны программистами на С#, которые пишут стандартный шаблон событий рейза, а также диагностируют NRE, когда они забыли проверить нуль. Оператор elvis (?.
) в С# v6, наконец, упростил работу.
Anyhoo, вы никогда не получите ничего, кроме null, из GetRaiseMethod(), если вы отражаете код, написанный на С#. Однако вы всегда получите ненулевое значение, когда оно было написано на VB.NET, F # или С++/CLI. Вам нужно будет выкопать переменную делегата, если вам нужно поднять событие с отражением, что может быть болезненным. Если использовались автогенераторы с добавлением/удалением, то переменная поддержки имеет то же имя, что и событие, и вы можете получить ее с помощью Type.GetField(), используя BindingFlags.NonPublic | BindingFlags.Instance.