Return to Snippet

Revision: 55457
at February 7, 2012 16:54 by nivlam


Initial Code
public class SessionDictionary : IDictionary<string,object>, IDictionary
{
   readonly HttpSessionState sessionState;
   readonly CollectionAdapter<string> keysAdapter;
   readonly CollectionAdapter<object> valuesAdapter;

   public SessionDictionary(HttpSessionState sessionState)
   {
      this.sessionState = sessionState;
      keysAdapter = new CollectionAdapter<string>(sessionState.Keys);
      valuesAdapter = new CollectionAdapter<object>(sessionState);
   }

   public bool ContainsKey(string key)
   {
      return keysAdapter.Contains(key);
   }

   public void Add(string name, object value)
   {
      sessionState.Add(name, value);
   }

   public bool Remove(string name)
   {
      if (!ContainsKey(name)) return false;
      sessionState.Remove(name);
      return true;
   }

   public bool TryGetValue(string key, out object value)
   {
      if (ContainsKey(key))
      {
         value = this[key];
         return true;
      }

      value = null;
      return false;
   }

   public void Add(KeyValuePair<string, object> item)
   {
      Add(item.Key, item.Value);
   }

   public bool Contains(object key)
   {
      return ContainsKey((string) key);
   }

   public void Add(object key, object value)
   {
      Add((string)key, value);
   }

   public void Clear()
   {
      sessionState.Clear();
   }

   IDictionaryEnumerator IDictionary.GetEnumerator()
   {
      return new DictionaryEnumerator<string, object>(KeyValueEnumerable().GetEnumerator());
   }

   public void Remove(object key)
   {
      Remove((string) key);
   }

   object IDictionary.this[object key]
   {
      get { return this[(string) key]; }
      set { this[(string) key] = value; }
   }

   public bool Contains(KeyValuePair<string, object> item)
   {
      if (!ContainsKey(item.Key)) return false;
      return Equals(this[item.Key], item.Value);
   }

   public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
   {
      CopyTo((Array)array, arrayIndex);
   }

   public bool Remove(KeyValuePair<string, object> item)
   {
      if (!Contains(item)) return false;
      return Remove(item.Key);
   }

   IEnumerator<KeyValuePair<string, object>> IEnumerable<KeyValuePair<string, object>>.GetEnumerator()
   {
      return KeyValueEnumerable().GetEnumerator();
   }

   IEnumerable<KeyValuePair<string, object>> KeyValueEnumerable()
   {
      return Keys.Select(key => new KeyValuePair<string, object>(key, this[key]));
   }

   public IEnumerator GetEnumerator()
   {
      return sessionState.GetEnumerator();
   }

   public object this[string name]
   {
      get { return sessionState[name]; }
      set { sessionState[name] = value; }
   }

   public void CopyTo(Array array, int index)
   {
      sessionState.CopyTo(array, index);
   }

   public int Count
   {
      get { return sessionState.Count; }
   }

   public object SyncRoot
   {
      get { return sessionState.SyncRoot; }
   }

   public bool IsSynchronized
   {
      get { return sessionState.IsSynchronized; }
   }

   public ICollection<string> Keys
   {
      get { return keysAdapter; }
   }

   ICollection IDictionary.Values
   {
      get { return valuesAdapter; }
   }

   ICollection IDictionary.Keys
   {
      get { return keysAdapter; }
   }

   public ICollection<object> Values
   {
      get { return valuesAdapter; }
   }

   public bool IsReadOnly
   {
      get { return sessionState.IsReadOnly; }
   }

   public bool IsFixedSize
   {
      get { return false; }
   }
}

public class CollectionAdapter<T> : ICollection<T>, ICollection
{
   readonly ICollection collection;

   public void CopyTo(Array array, int index)
   {
      collection.CopyTo(array, index);
   }

   public object SyncRoot
   {
      get { return collection.SyncRoot; }
   }

   public bool IsSynchronized
   {
      get { return collection.IsSynchronized; }
   }

   public CollectionAdapter(ICollection collection)
   {
      this.collection = collection;
   }

   IEnumerator<T> IEnumerable<T>.GetEnumerator()
   {
      return collection.Cast<T>().GetEnumerator();
   }

   public IEnumerator GetEnumerator()
   {
      return collection.GetEnumerator();
   }

   public void Add(T item)
   {
      throw new NotSupportedException();
   }

   public void Clear()
   {
      throw new NotSupportedException();
   }

   public bool Contains(T item)
   {
      return collection.Cast<T>().Any(x => Equals(x, item));
   }

   public void CopyTo(T[] array, int arrayIndex)
   {
      collection.CopyTo(array, arrayIndex);
   }

   public bool Remove(T item)
   {
      throw new NotSupportedException();
   }

   public int Count
   {
      get { return collection.Count; }
   }

   public bool IsReadOnly
   {
      get { return true; }
   }
}

public class DictionaryEnumerator<TKey,TValue> : IDictionaryEnumerator, IDisposable
{
   readonly IEnumerator<KeyValuePair<TKey, TValue>> enumerator;

   public DictionaryEnumerator(IEnumerator<KeyValuePair<TKey,TValue>> enumerator)
   {
      this.enumerator = enumerator;
   }

   public void Dispose()
   {
      enumerator.Dispose();
   }

   public bool MoveNext()
   {
      return enumerator.MoveNext();
   }

   public void Reset()
   {
      enumerator.Reset();
   }

   public object Current
   {
      get { return enumerator.Current; }
   }

   public object Key
   {
      get { return enumerator.Current.Key; }
   }

   public object Value
   {
      get { return enumerator.Current.Value; }
   }

   public DictionaryEntry Entry
   {
      get { return new DictionaryEntry(Key, Value); }
   }
}

Initial URL
http://blog.jason.smale.org/2010/08/dictionary-adapter-for-httpsessionstate_15.html

Initial Description
Session dictionary that wraps ASP.NET session so that it looks like a IDictionary

Initial Title
Session Dictionary

Initial Tags


Initial Language
C#