1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections;
\r
6 using System.Collections.Generic;
\r
7 using System.Reflection;
\r
9 namespace Microsoft.Internal.Collections
\r
11 internal static partial class CollectionServices
\r
13 public static ICollection<object> GetCollectionWrapper(Type itemType, object collectionObject)
\r
15 Assumes.NotNull(itemType, collectionObject);
\r
17 if (itemType == typeof(object))
\r
19 return (ICollection<object>)collectionObject;
\r
22 // Most common .Net collections implement IList as well so for those
\r
23 // cases we can optimize the wrapping instead of using reflection to create
\r
25 if (typeof(IList).IsAssignableFrom(collectionObject.GetType()))
\r
27 return new CollectionOfObjectList((IList)collectionObject);
\r
30 Type collectionType = typeof(CollectionOfObject<>).MakeGenericType(itemType);
\r
32 return (ICollection<object>)Activator.CreateInstance(collectionType, collectionObject);
\r
35 private class CollectionOfObjectList : ICollection<object>
\r
37 private readonly IList _list;
\r
39 public CollectionOfObjectList(IList list)
\r
44 public void Add(object item)
\r
46 this._list.Add(item);
\r
54 public bool Contains(object item)
\r
56 return Assumes.NotReachable<bool>();
\r
59 public void CopyTo(object[] array, int arrayIndex)
\r
61 Assumes.NotReachable<object>();
\r
66 get { return Assumes.NotReachable<int>(); }
\r
69 public bool IsReadOnly
\r
71 get { return this._list.IsReadOnly; }
\r
74 public bool Remove(object item)
\r
76 return Assumes.NotReachable<bool>();
\r
79 public IEnumerator<object> GetEnumerator()
\r
81 return Assumes.NotReachable<IEnumerator<object>>();
\r
84 IEnumerator IEnumerable.GetEnumerator()
\r
86 return Assumes.NotReachable<IEnumerator>();
\r
90 private class CollectionOfObject<T> : ICollection<object>
\r
92 private readonly ICollection<T> _collectionOfT;
\r
94 public CollectionOfObject(object collectionOfT)
\r
96 this._collectionOfT = (ICollection<T>)collectionOfT;
\r
99 public void Add(object item)
\r
101 this._collectionOfT.Add((T) item);
\r
104 public void Clear()
\r
106 this._collectionOfT.Clear();
\r
109 public bool Contains(object item)
\r
111 return Assumes.NotReachable<bool>();
\r
114 public void CopyTo(object[] array, int arrayIndex)
\r
116 Assumes.NotReachable<object>();
\r
121 get { return Assumes.NotReachable<int>(); }
\r
124 public bool IsReadOnly
\r
126 get { return this._collectionOfT.IsReadOnly; }
\r
129 public bool Remove(object item)
\r
131 return Assumes.NotReachable<bool>();
\r
134 public IEnumerator<object> GetEnumerator()
\r
136 return Assumes.NotReachable<IEnumerator<object>>();
\r
139 IEnumerator IEnumerable.GetEnumerator()
\r
141 return Assumes.NotReachable<IEnumerator>();
\r