(Я знаю, что название звучит просто, но держись, наверное, это не вопрос, который вы так думаете.)
В VB.NET мне удалось написать пользовательские события. Например, у меня был отдельный поток, который периодически поднимал событие, и в этом случае графический интерфейс должен был быть обновлен. Я не хотел, чтобы занятый поток беспокоился об вычислениях пользовательского интерфейса, и я не хотел помещать Me.Invoke(Sub()...) в обработчик события, так как он также вызывался из потока графического интерфейса.
Я придумал этот очень полезный бит кода. В потоке GUI будет установлен EventSyncInvoke = Me (основная форма). Затем поток мог просто поднять событие TestEvent, как обычно, никакого специального кода, и он будет легко выполнен в потоке GUI:
Private TestEventDelegate As EventHandler
Public EventSyncInvoke As System.ComponentModel.ISynchronizeInvoke
Public Custom Event TestEvent As EventHandler
    AddHandler(value As EventHandler)
        TestEventDelegate = [Delegate].Combine(TestEventDelegate, value)
    End AddHandler
    RemoveHandler(value As EventHandler)
        TestEventDelegate = [Delegate].Remove(TestEventDelegate, value)
    End RemoveHandler
    RaiseEvent(sender As Object, e As System.EventArgs)
        If EventSyncInvoke IsNot Nothing Then
            EventSyncInvoke.Invoke(TestEventDelegate, {sender, e})
        Else
            TestEventDelegate.Invoke({sender, e})
        End If
    End RaiseEvent
End Event
Теперь в С# я могу сделать так много:
public event EventHandler TestEvent
    add
    {
        testEventDelegate = (EventHandler)Delegate.Combine(testEventDelegate, value);
    }
    remove
    {
        testEventDelegate = (EventHandler)Delegate.Remove(testEventDelegate, value);
    }
}
Но где можно выполнять индивидуальное повышение?
  EDIT: 
Другие ответы сказали мне, что я не мог сделать это прямо на С#, но не объяснил, почему я не могу и почему я этого не хочу. Мне потребовалось некоторое время, чтобы понять, как С# события работали по сравнению с VB.NET. Я оставил мое собственное объяснение для других, у кого нет хорошего понимания этого, чтобы начать думать по правильным линиям.
Честно говоря, я так привык к шаблону OnTestEvent, что мне не совсем понравилась идея сделать его отличным от остальных вспомогательных методов.:-) Теперь, когда я понимаю обоснование, я вижу, что на самом деле это лучшее место для размещения этого материала.