3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 //------------------------------------------------------------------------------
7 //------------------------------------------------------------------------------
8 // <OWNER>[....]</OWNER>
11 namespace System.Collections {
14 using System.Security.Permissions;
16 // Useful base class for typed read/write collections where items derive from object
18 [System.Runtime.InteropServices.ComVisible(true)]
19 public abstract class DictionaryBase : IDictionary {
22 protected Hashtable InnerHashtable {
24 if (hashtable == null)
25 hashtable = new Hashtable();
30 protected IDictionary Dictionary {
31 get { return (IDictionary) this; }
35 // to avoid newing inner list if no items are ever added
36 get { return hashtable == null ? 0 : hashtable.Count; }
39 bool IDictionary.IsReadOnly {
40 get { return InnerHashtable.IsReadOnly; }
43 bool IDictionary.IsFixedSize {
44 get { return InnerHashtable.IsFixedSize; }
47 bool ICollection.IsSynchronized {
48 get { return InnerHashtable.IsSynchronized; }
51 ICollection IDictionary.Keys {
53 return InnerHashtable.Keys;
57 Object ICollection.SyncRoot {
58 get { return InnerHashtable.SyncRoot; }
61 ICollection IDictionary.Values {
63 return InnerHashtable.Values;
67 public void CopyTo(Array array, int index) {
68 InnerHashtable.CopyTo(array, index);
71 object IDictionary.this[object key] {
73 object currentValue = InnerHashtable[key];
74 OnGet(key, currentValue);
78 OnValidate(key, value);
79 bool keyExists = true;
80 Object temp = InnerHashtable[key];
82 keyExists = InnerHashtable.Contains(key);
85 OnSet(key, temp, value);
86 InnerHashtable[key] = value;
88 OnSetComplete(key, temp, value);
92 InnerHashtable[key] = temp;
95 InnerHashtable.Remove(key);
102 bool IDictionary.Contains(object key) {
103 return InnerHashtable.Contains(key);
106 void IDictionary.Add(object key, object value) {
107 OnValidate(key, value);
108 OnInsert(key, value);
109 InnerHashtable.Add(key, value);
111 OnInsertComplete(key, value);
114 InnerHashtable.Remove(key);
119 public void Clear() {
121 InnerHashtable.Clear();
125 void IDictionary.Remove(object key) {
126 if(InnerHashtable.Contains(key)) {
127 Object temp = InnerHashtable[key];
128 OnValidate(key, temp);
131 InnerHashtable.Remove(key);
133 OnRemoveComplete(key, temp);
136 InnerHashtable.Add(key, temp);
142 public IDictionaryEnumerator GetEnumerator() {
143 return InnerHashtable.GetEnumerator();
146 IEnumerator IEnumerable.GetEnumerator() {
147 return InnerHashtable.GetEnumerator();
150 protected virtual object OnGet(object key, object currentValue) {
154 protected virtual void OnSet(object key, object oldValue, object newValue) {
157 protected virtual void OnInsert(object key, object value) {
160 protected virtual void OnClear() {
163 protected virtual void OnRemove(object key, object value) {
166 protected virtual void OnValidate(object key, object value) {
169 protected virtual void OnSetComplete(object key, object oldValue, object newValue) {
172 protected virtual void OnInsertComplete(object key, object value) {
175 protected virtual void OnClearComplete() {
178 protected virtual void OnRemoveComplete(object key, object value) {