using System; using System.Collections; using System.Collections.Generic; namespace Nuclex.Support.Collections { /// Wraps a List and prevents users from modifying it /// Type of items to manage in the List public class ReadOnlyList : IList, IList { /// Initializes a new read-only List wrapper /// List that will be wrapped public ReadOnlyList(IList list) { this.typedList = list; this.objectList = (list as IList); } /// Retrieves the index of an item within the List /// Item whose index will be returned /// The zero-based index of the specified item in the List public int IndexOf(ItemType item) { return this.typedList.IndexOf(item); } /// Accesses the List item with the specified index /// Zero-based index of the List item that will be accessed public ItemType this[int index] { get { return this.typedList[index]; } } /// Determines whether the List contains the specified item /// Item that will be checked for /// True if the specified item is contained in the List public bool Contains(ItemType item) { return this.typedList.Contains(item); } /// Copies the contents of the List into an array /// Array the List will be copied into /// /// Starting index at which to begin filling the destination array /// public void CopyTo(ItemType[] array, int arrayIndex) { this.typedList.CopyTo(array, arrayIndex); } /// The number of items current contained in the List public int Count { get { return this.typedList.Count; } } /// Whether the List is write-protected public bool IsReadOnly { get { return true; } } /// Returns a new enumerator over the contents of the List /// The new List contents enumerator public IEnumerator GetEnumerator() { return this.typedList.GetEnumerator(); } #region IList<> implementation /// Inserts an item into the List /// Zero-based index before which the item will be inserted /// Item that will be inserted into the List void IList.Insert(int index, ItemType item) { throw new NotSupportedException( "Inserting items is not supported by the read-only List" ); } /// Removes an item from the list /// Zero-based index of the item that will be removed void IList.RemoveAt(int index) { throw new NotSupportedException( "Removing items is not supported by the read-only List" ); } /// Accesses the List item with the specified index /// Zero-based index of the List item that will be accessed ItemType IList.this[int index] { get { return this.typedList[index]; } set { throw new NotSupportedException( "Assigning items is not supported by the read-only List" ); } } #endregion #region ICollection<> implementation /// Adds an item to the end of the List /// Item that will be added to the List void ICollection.Add(ItemType item) { throw new NotSupportedException( "Adding items is not supported by the read-only List" ); } /// Removes all items from the List void ICollection.Clear() { throw new NotSupportedException( "Clearing is not supported by the read-only List" ); } /// Removes the specified item from the List /// Item that will be removed from the List /// True of the specified item was found in the List and removed bool ICollection.Remove(ItemType item) { throw new NotSupportedException( "Removing items is not supported by the read-only List" ); } #endregion #region IEnumerable implementation /// Returns a new enumerator over the contents of the List /// The new List contents enumerator IEnumerator IEnumerable.GetEnumerator() { return this.objectList.GetEnumerator(); } #endregion #region IList implementation /// Removes all items from the List void IList.Clear() { throw new NotSupportedException( "Clearing is not supported by the read-only List" ); } /// Adds an item to the end of the List /// Item that will be added to the List int IList.Add(object value) { throw new NotSupportedException( "Adding items is not supported by the read-only List" ); } /// Determines whether the List contains the specified item /// Item that will be checked for /// True if the specified item is contained in the List bool IList.Contains(object value) { return this.objectList.Contains(value); } /// Retrieves the index of an item within the List /// Item whose index will be returned /// The zero-based index of the specified item in the List int IList.IndexOf(object value) { return this.objectList.IndexOf(value); } /// Inserts an item into the List /// Zero-based index before which the item will be inserted /// Item that will be inserted into the List void IList.Insert(int index, object value) { throw new NotSupportedException( "Inserting items is not supported by the read-only List" ); } /// Whether the size of the List is fixed bool IList.IsFixedSize { get { throw new NotImplementedException(); } } /// Removes the specified item from the List /// Item that will be removed from the List /// True of the specified item was found in the List and removed void IList.Remove(object value) { throw new NotSupportedException( "Removing items is not supported by the read-only List" ); } /// Removes an item from the list /// Zero-based index of the item that will be removed void IList.RemoveAt(int index) { throw new NotSupportedException( "Removing items is not supported by the read-only List" ); } /// Accesses the List item with the specified index /// Zero-based index of the List item that will be accessed object IList.this[int index] { get { return this.objectList[index]; } set { throw new NotSupportedException( "Assigning items is not supported by the read-only List" ); } } #endregion #region ICollection implementation /// Copies the contents of the List into an array /// Array the List will be copied into /// /// Starting index at which to begin filling the destination array /// void ICollection.CopyTo(Array array, int index) { this.objectList.CopyTo(array, index); } /// Whether the List is synchronized for multi-threaded usage bool ICollection.IsSynchronized { get { return this.objectList.IsSynchronized; } } /// Synchronization root on which the List locks object ICollection.SyncRoot { get { return this.objectList.SyncRoot; } } #endregion /// The wrapped List under its type-safe interface private IList typedList; /// The wrapped List under its object interface private IList objectList; } } // namespace Nuclex.Support.Collections