#region Apache License 2.0
/*
Nuclex .NET Framework
Copyright (C) 2002-2024 Markus Ewald / Nuclex Development Labs
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#endregion // Apache License 2.0
using System;
using System.Collections;
using System.Collections.Generic;
namespace Nuclex.Support.Collections {
/// Wraps a Collection and prevents users from modifying it
/// Type of items to manage in the Collection
public class ReadOnlyCollection :
ICollection,
ICollection {
/// Initializes a new read-only Collection wrapper
/// Collection that will be wrapped
public ReadOnlyCollection(ICollection collection) {
this.typedCollection = collection;
this.objectCollection = (collection as ICollection);
}
/// 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(TItem item) {
return this.typedCollection.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(TItem[] array, int arrayIndex) {
this.typedCollection.CopyTo(array, arrayIndex);
}
/// The number of items current contained in the List
public int Count {
get { return this.typedCollection.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.typedCollection.GetEnumerator();
}
#region ICollection<> implementation
/// Adds an item to the end of the List
/// Item that will be added to the List
void ICollection.Add(TItem 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(TItem 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.objectCollection.GetEnumerator();
}
#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.objectCollection.CopyTo(array, index);
}
/// Whether the List is synchronized for multi-threaded usage
bool ICollection.IsSynchronized {
get { return this.objectCollection.IsSynchronized; }
}
/// Synchronization root on which the List locks
object ICollection.SyncRoot {
get { return this.objectCollection.SyncRoot; }
}
#endregion
/// The wrapped Collection under its type-safe interface
private ICollection typedCollection;
/// The wrapped Collection under its object interface
private ICollection objectCollection;
}
} // namespace Nuclex.Support.Collections