1: class MyClass {
2: // keys to identify events in the dictionary
3: private static readonly object Event1Key = new object();
4: private static readonly object Event2Key = new object();
5: private static readonly object Event3Key = new object();
6: private static readonly object Event4Key = new object();
7: // stores all active events
8: private readonly Dictionary<object, Delegate> events = new Dictionary<object, Delegate>();
9:
10: public event EventHandler Event1 {
11: add { AddHandler( Event1Key, value ); }
12: remove { RemoveHandler( Event1Key, value ); }
13: }
14:
15: public event EventHandler Event2 {
16: add { AddHandler( Event2Key, value ); }
17: remove { RemoveHandler( Event2Key, value ); }
18: }
19:
20: public event EventHandler Event3 {
21: add { AddHandler( Event3Key, value ); }
22: remove { RemoveHandler( Event3Key, value ); }
23: }
24:
25: public event EventHandler Event4 {
26: add { AddHandler( Event4Key, value ); }
27: remove { RemoveHandler( Event4Key, value ); }
28: }
29:
30: // add a handler using the dictionary
31: private void AddHandler( object key, Delegate value ) {
32: Delegate old;
33: if ( events.TryGetValue( key, out old ) ) {
34: // Handler exists, combine old with new
35: events[ key ] = Delegate.Combine( old, value );
36: } else {
37: // Handler does not exist
38: events[ key ] = value;
39: }
40: }
41:
42: // remove a handler using the dictionary
43: private void RemoveHandler( object key, Delegate value ) {
44: Delegate old;
45: if ( events.TryGetValue( key, out old ) ) {
46: // Handler exists, remove it
47: events[ key ] = Delegate.Remove( old, value );
48: }
49: }
50:
51: // raises a specific event
52: protected void Raise( object key, object sender, EventArgs e ) {
53: Delegate handler;
54: if ( events.TryGetValue( key, out handler ) ) {
55: // assume we use a delegate format similar to EventHandler,
56: // i.e.: it expects (object sender, EventArgs e) as arguments
57: handler.DynamicInvoke( sender, e );
58: }
59: }
60:
61: // Some method that raises an event
62: public void SomeMethod() {
63: // ...
64: // Raise Event1
65: Raise( Event1Key, this, EventArgs.Empty );
66: // Raise Event3
67: Raise( Event3Key, this, EventArgs.Empty );
68: }
69: }