PropertyInformationCollection
Contains a collection of  PropertyInformation objects. This class cannot be inherited.
                using System.Collections;
using System.Collections.Specialized;
using System.Runtime.CompilerServices;
namespace System.Configuration
{
    public sealed class PropertyInformationCollection : NameObjectCollectionBase
    {
        public PropertyInformation this[string propertyName] {
            get {
                PropertyInformation propertyInformation = (PropertyInformation)BaseGet(propertyName);
                if (propertyInformation == null) {
                    PropertyInformation propertyInformation2 = (PropertyInformation)BaseGet("");
                    if (propertyInformation2 != null && propertyInformation2.ProvidedName == propertyName)
                        propertyInformation = propertyInformation2;
                }
                return propertyInformation;
            }
        }
        internal PropertyInformation this[int index] {
            get {
                return (PropertyInformation)BaseGet(BaseGetKey(index));
            }
        }
        internal PropertyInformationCollection(ConfigurationElement thisElement)
            : base(StringComparer.Ordinal)
        {
            foreach (ConfigurationProperty property in thisElement.Properties) {
                if (property.Name != thisElement.ElementTagName)
                    BaseAdd(property.Name, new PropertyInformation(thisElement, property.Name));
            }
            base.IsReadOnly = true;
        }
        public void CopyTo(PropertyInformation[] array, int index)
        {
            ArgumentNullException.ThrowIfNull(array, "array");
            if (array.Length < Count + index)
                throw new ArgumentOutOfRangeException("index");
            IEnumerator enumerator = GetEnumerator();
            try {
                while (enumerator.MoveNext()) {
                    PropertyInformation propertyInformation = (PropertyInformation)enumerator.Current;
                    array[index++] = propertyInformation;
                }
            } finally {
                IDisposable disposable = enumerator as IDisposable;
                if (disposable != null)
                    disposable.Dispose();
            }
        }
        [IteratorStateMachine(typeof(<GetEnumerator>d__6))]
        public override IEnumerator GetEnumerator()
        {
            <GetEnumerator>d__6 <GetEnumerator>d__ = new <GetEnumerator>d__6(0);
            <GetEnumerator>d__.<>4__this = this;
            return <GetEnumerator>d__;
        }
    }
}