// Longer description
// </remarks>
public sealed class EventHandlerList : IDisposable {
- Hashtable table;
-
public EventHandlerList ()
{
+ head = null;
}
public Delegate this [object key] {
get {
- if (table == null)
- return null;
-
- return table [key] as Delegate;
+ ListNode entry = FindEntry (key);
+ return entry == null ? null : entry.value;
}
set {
public void AddHandler (object key, Delegate value)
{
- if (table == null)
- table = new Hashtable ();
+ ListNode entry = FindEntry (key);
+ if (entry == null) {
+ head = new ListNode (key, value, head);
+ return;
+ }
+ entry.value = Delegate.Combine (entry.value, value);
+ }
- Delegate prev = table [key] as Delegate;
- prev = Delegate.Combine (prev, value);
- table [key] = prev;
+#if NET_2_0
+ public void AddHandlers (EventHandlerList listToAddFrom)
+ {
+ if (listToAddFrom == null) {
+ return;
+ }
+
+ for (ListNode entry = listToAddFrom.head; entry != null; entry = entry.next) {
+ AddHandler (entry.key, entry.value);
+ }
}
+#endif
public void RemoveHandler (object key, Delegate value)
{
- if (table == null)
+ ListNode entry = FindEntry (key);
+ if (entry == null)
return;
- Delegate prev = table [key] as Delegate;
- prev = Delegate.Remove (prev, value);
- table [key] = prev;
+ entry.value = Delegate.Remove (entry.value, value);
}
public void Dispose ()
{
- table = null;
+ head = null;
}
+ private ListNode FindEntry (object key)
+ {
+ for (ListNode entry = head; entry != null; entry = entry.next)
+ if (key == entry.key)
+ return entry;
+ return null;
+ }
+
+ [Serializable]
+ private class ListNode
+ {
+ public object key;
+ public Delegate value;
+ public ListNode next;
+ public ListNode (object key, Delegate value, ListNode next)
+ {
+ this.key = key;
+ this.value = value;
+ this.next = next;
+ }
+ }
+
+ private ListNode head;
+
}
}