The other answers told me the fact that I couldn't do this directly in C#, but not the rationale behind why I can't and why I wouldn't want to. It took me a while to understand how C# events worked in comparison to VB.NET. So this explanation is for others who don't have a good grasp on this to start thinking along the right lines.
Honestly, I was so used to the boilerplate OnTestEvent
format that I didn't quite like the idea of making it different from the rest of the helper methods. :-) But now that I understand the rationale, I see that it is actually the best place to put this stuff.
VB.NET allows you to hide the background details of calling the delegates with the RaiseEvent
keyword. RaiseEvent
calls either the event delegate or your custom RaiseEvent
section for a custom event.
In C#, there is no RaiseEvent
. Raising an event is basically no more than calling a delegate. No custom RaiseEvent
sections can be seamlessly called when all you're doing to raise it is calling a delegate. So for C#, custom events are like skeletons, implementing add and remove for events but not implementing the ability to raise them. It's like having to replace all your RaiseEvent
TestEvent(sender, e)
with the code from the custom RaiseEvent
section.
For a normal event, raising looks roughly like NormalEvent(sender, e)
. But as soon as you put in a custom add and remove, you must use whatever variable you used in the add and remove because the compiler isn't doing it anymore. It's like automatic properties in VB.NET: once you put in a getter and setter manually, you have to declare and handle your own local variable. So instead of TestEvent(sender, e)
, use testEventDelegate(sender, e)
. That's where you rerouted the event delegates.
I compared moving from VB.NET to C# with having to replace each of your RaiseEvents
with your custom RaiseEvent
code. A RaiseEvent
code section is basically an event and a helper function rolled together. It's actually standard to only have one instance of a RaiseEvent
in either VB.NET or C# inside a protected OnTestEvent
method and call that method to raise the event. This allows any code with access to the protected (or private or public) OnTestE
vent to raise the event. For what you want to do, just putting it in the method is easier, simpler and performs slightly better. This is best practice.
Now if you really want to want (or need) somehow to mimic VB.NET's RaiseEvent nitty-gritty-hiding call SomeDelegate(sender, e)
and have the magic happen, you can simply hide the nitty-gritty inside a second delegate:
NiceTestEvent = (sender, e) => eventSyncInvoke.Invoke(testEventDelegate, new object[] { sender, e });
Now you can call NiceTestEvent(sender, e)
. You won't be able to call TestEvent(sender, e)
though. TestEvent
is only for outside code to add and remove through, as Visual Studio will tell you.