ConfigurationSectionGroupCollection
using System.Collections;
using System.Collections.Specialized;
namespace System.Configuration
{
public sealed class ConfigurationSectionGroupCollection : NameObjectCollectionBase
{
private readonly ConfigurationSectionGroup _configSectionGroup;
private MgmtConfigurationRecord _configRecord;
public ConfigurationSectionGroup this[string name] {
get {
return Get(name);
}
}
public ConfigurationSectionGroup this[int index] {
get {
return Get(index);
}
}
internal ConfigurationSectionGroupCollection(MgmtConfigurationRecord configRecord, ConfigurationSectionGroup configSectionGroup)
: base(StringComparer.Ordinal)
{
_configRecord = configRecord;
_configSectionGroup = configSectionGroup;
IDictionaryEnumerator enumerator = _configRecord.SectionGroupFactories.GetEnumerator();
try {
while (enumerator.MoveNext()) {
FactoryId factoryId = (FactoryId)((DictionaryEntry)enumerator.Current).Value;
if (factoryId.Group == _configSectionGroup.SectionGroupName)
BaseAdd(factoryId.Name, factoryId.Name);
}
} finally {
(enumerator as IDisposable)?.Dispose();
}
}
internal void DetachFromConfigurationRecord()
{
_configRecord = null;
BaseClear();
}
private void VerifyIsAttachedToConfigRecord()
{
if (_configRecord == null)
throw new InvalidOperationException(System.SR.Config_cannot_edit_configurationsectiongroup_when_not_attached);
}
public void Add(string name, ConfigurationSectionGroup sectionGroup)
{
VerifyIsAttachedToConfigRecord();
_configRecord.AddConfigurationSectionGroup(_configSectionGroup.SectionGroupName, name, sectionGroup);
BaseAdd(name, name);
}
public void Clear()
{
VerifyIsAttachedToConfigRecord();
if (_configSectionGroup.IsRoot)
_configRecord.RemoveLocationWriteRequirement();
string[] array = BaseGetAllKeys();
string[] array2 = array;
foreach (string name in array2) {
Remove(name);
}
}
public void CopyTo(ConfigurationSectionGroup[] array, int index)
{
if (array == null)
throw new ArgumentNullException("array");
int count = Count;
if (array.Length < count + index)
throw new ArgumentOutOfRangeException("index");
int num = 0;
int num2 = index;
while (num < count) {
array[num2] = Get(num);
num++;
num2++;
}
}
public ConfigurationSectionGroup Get(int index)
{
return Get(GetKey(index));
}
public ConfigurationSectionGroup Get(string name)
{
VerifyIsAttachedToConfigRecord();
if (string.IsNullOrEmpty(name))
throw ExceptionUtil.ParameterNullOrEmpty("name");
if (name.IndexOf('/') >= 0)
return null;
string configKey = BaseConfigurationRecord.CombineConfigKey(_configSectionGroup.SectionGroupName, name);
return _configRecord.GetSectionGroup(configKey);
}
public override IEnumerator GetEnumerator()
{
int c = Count;
for (int i = 0; i < c; i++) {
yield return (object)this[i];
}
}
public string GetKey(int index)
{
return BaseGetKey(index);
}
public void Remove(string name)
{
VerifyIsAttachedToConfigRecord();
_configRecord.RemoveConfigurationSectionGroup(_configSectionGroup.SectionGroupName, name);
string key = BaseConfigurationRecord.CombineConfigKey(_configSectionGroup.SectionGroupName, name);
if (!_configRecord.SectionFactories.Contains(key))
BaseRemove(name);
}
public void RemoveAt(int index)
{
VerifyIsAttachedToConfigRecord();
Remove(GetKey(index));
}
}
}