Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Collections / ObjectModel / ReadOnlyCollection.cs / 1 / ReadOnlyCollection.cs
namespace System.Collections.ObjectModel
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
[Serializable()]
[System.Runtime.InteropServices.ComVisible(false)]
[DebuggerTypeProxy(typeof(Mscorlib_CollectionDebugView<>))]
[DebuggerDisplay("Count = {Count}")]
public class ReadOnlyCollection: IList, IList
{
IList list;
[NonSerialized]
private Object _syncRoot;
public ReadOnlyCollection(IList list) {
if (list == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list);
}
this.list = list;
}
public int Count {
get { return list.Count; }
}
public T this[int index] {
get { return list[index]; }
}
public bool Contains(T value) {
return list.Contains(value);
}
public void CopyTo(T[] array, int index) {
list.CopyTo(array, index);
}
public IEnumerator GetEnumerator() {
return list.GetEnumerator();
}
public int IndexOf(T value) {
return list.IndexOf(value);
}
protected IList Items {
get {
return list;
}
}
bool ICollection.IsReadOnly {
get { return true; }
}
T IList.this[int index] {
get { return list[index]; }
set {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
}
void ICollection.Add(T value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void ICollection.Clear() {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void IList.Insert(int index, T value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
bool ICollection.Remove(T value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
return false;
}
void IList.RemoveAt(int index) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
IEnumerator IEnumerable.GetEnumerator() {
return ((IEnumerable)list).GetEnumerator();
}
bool ICollection.IsSynchronized {
get { return false; }
}
object ICollection.SyncRoot {
get {
if( _syncRoot == null) {
ICollection c = list as ICollection;
if( c != null) {
_syncRoot = c.SyncRoot;
}
else {
System.Threading.Interlocked.CompareExchange(ref _syncRoot, new Object(), null);
}
}
return _syncRoot;
}
}
void ICollection.CopyTo(Array array, int index) {
if (array==null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
}
if (array.Rank != 1) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_RankMultiDimNotSupported);
}
if( array.GetLowerBound(0) != 0 ) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_NonZeroLowerBound);
}
if (index < 0) {
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.arrayIndex, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
}
if (array.Length - index < Count) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
}
T[] items = array as T[];
if (items != null) {
list.CopyTo(items, index);
}
else {
//
// Catch the obvious case assignment will fail.
// We can found all possible problems by doing the check though.
// For example, if the element type of the Array is derived from T,
// we can't figure out if we can successfully copy the element beforehand.
//
Type targetType = array.GetType().GetElementType();
Type sourceType = typeof(T);
if(!(targetType.IsAssignableFrom(sourceType) || sourceType.IsAssignableFrom(targetType))) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
}
//
// We can't cast array of value type to object[], so we don't support
// widening of primitive types here.
//
object[] objects = array as object[];
if( objects == null) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
}
int count = list.Count;
try {
for (int i = 0; i < count; i++) {
objects[index++] = list[i];
}
}
catch(ArrayTypeMismatchException) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
}
}
}
bool IList.IsFixedSize {
get { return true; }
}
bool IList.IsReadOnly {
get { return true; }
}
object IList.this[int index] {
get { return list[index]; }
set {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
}
int IList.Add(object value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
return -1;
}
void IList.Clear() {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
private static bool IsCompatibleObject(object value) {
if( (value is T) || ( value == null && !typeof(T).IsValueType) ) {
return true;
}
return false;
}
bool IList.Contains(object value) {
if(IsCompatibleObject(value)) {
return Contains((T)value);
}
return false;
}
int IList.IndexOf(object value) {
if(IsCompatibleObject(value)) {
return IndexOf((T)value);
}
return -1;
}
void IList.Insert(int index, object value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void IList.Remove(object value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void IList.RemoveAt(int index) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
private static void VerifyValueType(object value) {
if( !IsCompatibleObject(value)) {
ThrowHelper.ThrowWrongValueTypeArgumentException(value, typeof(T));
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
namespace System.Collections.ObjectModel
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
[Serializable()]
[System.Runtime.InteropServices.ComVisible(false)]
[DebuggerTypeProxy(typeof(Mscorlib_CollectionDebugView<>))]
[DebuggerDisplay("Count = {Count}")]
public class ReadOnlyCollection: IList, IList
{
IList list;
[NonSerialized]
private Object _syncRoot;
public ReadOnlyCollection(IList list) {
if (list == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list);
}
this.list = list;
}
public int Count {
get { return list.Count; }
}
public T this[int index] {
get { return list[index]; }
}
public bool Contains(T value) {
return list.Contains(value);
}
public void CopyTo(T[] array, int index) {
list.CopyTo(array, index);
}
public IEnumerator GetEnumerator() {
return list.GetEnumerator();
}
public int IndexOf(T value) {
return list.IndexOf(value);
}
protected IList Items {
get {
return list;
}
}
bool ICollection.IsReadOnly {
get { return true; }
}
T IList.this[int index] {
get { return list[index]; }
set {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
}
void ICollection.Add(T value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void ICollection.Clear() {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void IList.Insert(int index, T value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
bool ICollection.Remove(T value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
return false;
}
void IList.RemoveAt(int index) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
IEnumerator IEnumerable.GetEnumerator() {
return ((IEnumerable)list).GetEnumerator();
}
bool ICollection.IsSynchronized {
get { return false; }
}
object ICollection.SyncRoot {
get {
if( _syncRoot == null) {
ICollection c = list as ICollection;
if( c != null) {
_syncRoot = c.SyncRoot;
}
else {
System.Threading.Interlocked.CompareExchange(ref _syncRoot, new Object(), null);
}
}
return _syncRoot;
}
}
void ICollection.CopyTo(Array array, int index) {
if (array==null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
}
if (array.Rank != 1) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_RankMultiDimNotSupported);
}
if( array.GetLowerBound(0) != 0 ) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_NonZeroLowerBound);
}
if (index < 0) {
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.arrayIndex, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
}
if (array.Length - index < Count) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
}
T[] items = array as T[];
if (items != null) {
list.CopyTo(items, index);
}
else {
//
// Catch the obvious case assignment will fail.
// We can found all possible problems by doing the check though.
// For example, if the element type of the Array is derived from T,
// we can't figure out if we can successfully copy the element beforehand.
//
Type targetType = array.GetType().GetElementType();
Type sourceType = typeof(T);
if(!(targetType.IsAssignableFrom(sourceType) || sourceType.IsAssignableFrom(targetType))) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
}
//
// We can't cast array of value type to object[], so we don't support
// widening of primitive types here.
//
object[] objects = array as object[];
if( objects == null) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
}
int count = list.Count;
try {
for (int i = 0; i < count; i++) {
objects[index++] = list[i];
}
}
catch(ArrayTypeMismatchException) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
}
}
}
bool IList.IsFixedSize {
get { return true; }
}
bool IList.IsReadOnly {
get { return true; }
}
object IList.this[int index] {
get { return list[index]; }
set {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
}
int IList.Add(object value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
return -1;
}
void IList.Clear() {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
private static bool IsCompatibleObject(object value) {
if( (value is T) || ( value == null && !typeof(T).IsValueType) ) {
return true;
}
return false;
}
bool IList.Contains(object value) {
if(IsCompatibleObject(value)) {
return Contains((T)value);
}
return false;
}
int IList.IndexOf(object value) {
if(IsCompatibleObject(value)) {
return IndexOf((T)value);
}
return -1;
}
void IList.Insert(int index, object value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void IList.Remove(object value) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
void IList.RemoveAt(int index) {
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
private static void VerifyValueType(object value) {
if( !IsCompatibleObject(value)) {
ThrowHelper.ThrowWrongValueTypeArgumentException(value, typeof(T));
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ClientApiGenerator.cs
- ManipulationPivot.cs
- ObjectConverter.cs
- KnownTypesProvider.cs
- SqlCacheDependency.cs
- Int32Animation.cs
- RedirectionProxy.cs
- figurelengthconverter.cs
- StateDesigner.TransitionInfo.cs
- ControlBuilderAttribute.cs
- QilVisitor.cs
- CookieHandler.cs
- StickyNote.cs
- SByteConverter.cs
- OdbcInfoMessageEvent.cs
- ServiceObjectContainer.cs
- CryptoKeySecurity.cs
- BindingUtils.cs
- PropertyChangingEventArgs.cs
- CodeExporter.cs
- PriorityBinding.cs
- CodePageUtils.cs
- SingleObjectCollection.cs
- SourceFileBuildProvider.cs
- UpdateTracker.cs
- HttpErrorTraceRecord.cs
- TableLayoutPanelCellPosition.cs
- BuildProvidersCompiler.cs
- FloaterParagraph.cs
- StyleCollection.cs
- MatrixValueSerializer.cs
- PreviewKeyDownEventArgs.cs
- SocketAddress.cs
- Registry.cs
- HttpCachePolicyElement.cs
- NeutralResourcesLanguageAttribute.cs
- ButtonBase.cs
- CustomCategoryAttribute.cs
- Model3D.cs
- SystemNetworkInterface.cs
- LogicalExpressionTypeConverter.cs
- CalendarKeyboardHelper.cs
- StatusBarDesigner.cs
- InvokeProviderWrapper.cs
- ListViewHitTestInfo.cs
- RectangleConverter.cs
- EditorPartCollection.cs
- ProxyAttribute.cs
- TypedTableBase.cs
- ThemeDirectoryCompiler.cs
- DataGridViewRowEventArgs.cs
- InputProcessorProfiles.cs
- Int16Animation.cs
- JsonMessageEncoderFactory.cs
- Pen.cs
- CheckBoxAutomationPeer.cs
- MessageBox.cs
- SQLRoleProvider.cs
- ExtendedTransformFactory.cs
- CheckBox.cs
- ColorBlend.cs
- ConfigurationLocationCollection.cs
- KeyboardNavigation.cs
- SystemIcmpV6Statistics.cs
- AutoCompleteStringCollection.cs
- XmlChildEnumerator.cs
- ToolTipService.cs
- LambdaCompiler.Expressions.cs
- TeredoHelper.cs
- FirstMatchCodeGroup.cs
- XmlSerializerFactory.cs
- TypeUsage.cs
- ExpandSegment.cs
- RoleManagerSection.cs
- FormViewPageEventArgs.cs
- UnsafePeerToPeerMethods.cs
- PropertyGridDesigner.cs
- ProjectedWrapper.cs
- EntityClientCacheEntry.cs
- AsnEncodedData.cs
- EnvelopeVersion.cs
- parserscommon.cs
- AlgoModule.cs
- HttpSessionStateWrapper.cs
- FormattedTextSymbols.cs
- FormView.cs
- SemanticAnalyzer.cs
- PingOptions.cs
- QueryableDataSourceEditData.cs
- Compilation.cs
- SystemTcpStatistics.cs
- RegexCode.cs
- Point3DCollectionConverter.cs
- EntityParameter.cs
- MexTcpBindingElement.cs
- ListBindingHelper.cs
- SiteMembershipCondition.cs
- SubMenuStyle.cs
- ButtonChrome.cs
- RecognizedPhrase.cs