3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 //------------------------------------------------------------------------------
7 //------------------------------------------------------------------------------
8 // <OWNER>Microsoft</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) {