Другие ответы говорили мне о том факте, что я не мог сделать это непосредственно в C #, но не объясняли, почему я не могу и почему я не хочу. Мне потребовалось некоторое время, чтобы понять, как работают события C # по сравнению с VB.NET. Так что это объяснение для тех, кто не имеет достаточного понимания, чтобы начать думать в правильном направлении.
Честно говоря, я настолько привык к шаблону OnTestEvent
, что мне не очень понравилась идея отличить его от остальных вспомогательных методов. :-) Но теперь, когда я понимаю обоснование, я вижу, что на самом деле это лучшее место для размещения этого материала.
VB.NET позволяет скрыть детали фона вызова делегатов с ключевым словом RaiseEvent
. RaiseEvent
вызывает либо делегат события, либо ваш пользовательский раздел RaiseEvent
для пользовательского события.
В C # нет RaiseEvent
. Вызов события в основном не более, чем вызов делегата. Никакие пользовательские секции RaiseEvent
не могут быть легко вызваны, когда все, что вы делаете для его вызова, - это вызов делегата. Так что для C # пользовательские события похожи на скелеты, реализующие добавление и удаление для событий, но не реализующие возможность их вызывать. Это все равно, что заменить все ваши RaiseEvent
TestEvent(sender, e)
кодом из пользовательского раздела RaiseEvent
.
Для обычного события рейз выглядит примерно как NormalEvent(sender, e)
. Но как только вы добавляете пользовательские операции добавления и удаления, вы должны использовать любую переменную, которую вы использовали в операции добавления и удаления, потому что компилятор больше этого не делает. Это похоже на автоматические свойства в VB.NET: после того, как вы вручную добавили метод получения и установки, вы должны объявить и обработать свою собственную локальную переменную. Поэтому вместо TestEvent(sender, e)
используйте testEventDelegate(sender, e)
. Вот куда вы перенаправили делегатов мероприятия.
Я сравнил переход с VB.NET на C # с необходимостью замены каждого вашего RaiseEvents
на ваш собственный RaiseEvent
код. Секция кода RaiseEvent
- это, по сути, событие и объединенная вспомогательная функция. На самом деле стандартно иметь только один экземпляр RaiseEvent
в VB.NET или C # внутри защищенного метода OnTestEvent
. и вызвать этот метод, чтобы вызвать событие. Это позволяет любому коду с доступом к защищенному (или частному или общедоступному) вентилятору OnTest E
инициировать событие. Для того, что вы хотите сделать, просто вставить это в метод проще, проще и выполнять немного лучше. Это лучшая практика.
Теперь, если вы действительно хотите (или нуждаетесь) каким-либо образом имитировать вызов RaiseEvent от VB.NET, скрывающий скрытность SomeDelegate(sender, e)
, и волшебство происходит, вы можете просто скрыть скрытность внутри второго делегата:
NiceTestEvent = (sender, e) => eventSyncInvoke.Invoke(testEventDelegate, new object[] { sender, e });
Теперь вы можете позвонить NiceTestEvent(sender, e)
. Вы не сможете звонить TestEvent(sender, e)
, хотя. TestEvent
предназначен только для добавления и удаления внешнего кода, как скажет Visual Studio.