Possible Duplicate:
How to pass an event to a method?
Is it possible to pass an event as a parameter to a method?
For example, the following method subscribes to the event, does work, and unsubscribes from the event:
void SubscribeDoAndUnsubscribe<TElement, TEventArgs>( IEnumerable<TElement> elements, ??? elementEvent) where TEventArgs: EventArgs { EventHandler<TEventArgs> handler = (sender, e) => { /* Handle an event */ }; foreach (var element in elements) { // Subscribe somehow element.elementEvent += handler } // Do things foreach (var element in elements) { // Unsubscribe somehow element.elementEvent -= handler } }
Client code:
var elements = new [] { new Button(), new Button() }; SubscribeDoAndUnsubscribe(elements, ??? /* e => e.Click */);
If it's not possible, how do I achieve the similar logic in other ways? Shall I pass pair of delegates for subscribe/unsubscribe methods?
To pass a value by reference, begin by initializing a variable and setting its value. Now, declare a method in the following syntax: Name(ref var). Inside the brackets is the value type parameter. Both of these must be placed into the static void Main() method of the object class.
Parameters of the even handlers are defined by the "event arguments" class (derived from System. EventArgs ); and you cannot change the signature of the event handler. So, you should have asked, "can I pass additional information?". Of course you can.
To pass an event and parameter onClick in React:Pass an inline function to the onClick prop of the element. The function should take the event object and call handleClick . Pass the event and parameter to handleClick .
You have in fact discovered that events are not "first class" in C#; you cannot pass around an event as data. You can pass around a delegate to a method associated with a receiver as a first-class object by making a delegate. You can pass around a reference to any variable as a (mostly) first-class object. (I say "mostly" because references to variables cannot be stored in fields, stored in arrays, and so on; they are highly restricted compared to other kinds of data.) You can pass around a type by obtaining its Type object and passing that around.
But there is no way to directly pass around as data an event, property, indexer, constructor or destructor associated with a particular instance. The best you can do is to make a delegate (or pair of delegates) out of a lambda, as you suggest. Or, obtain the reflection object associated with the event and pass that around, along with the instance.
No, unfortunately not.
If you look at Reactive Extensions, that suffers from a similar problem. Three options they use (IIRC - it's been a while since I've looked):
EventInfo
and call it with reflectionThe call in the latter case would be something like:
SubscribeAndDoUnsubscribe(elements, handler => e.Click += handler, handler => e.Click -= handler);
and the declaration would be:
void SubscribeDoAndUnsubscribe<TElement, TEventArgs>( IEnumerable<TElement> elements, Action<EventHandler<TEventArgs>> subscription, Action<EventHandler<TEventArgs>> unsubscription) where TEventArgs: EventArgs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With