Я тоже посмотрел на это. PolymorphicConfigurationElementCollection<T>
кажется устаревшим .
Изменить: это не так, см. Комментарий «Абатищев» ниже, я просто связывал старую версию.
Решение Rest Wing было многообещающим, но, к сожалению, требовало вызова внутренних методов, находящихся в другом пространстве имен. Хотя это возможно с помощью размышлений, в этом случае он не получит цены за кодирование красоты.
Я тоже покопался в источнике с Reflection и нашел следующее решение:
[ConfigurationCollection(typeof(ElementBaseConfig), CollectionType=ConfigurationElementCollectionType.BasicMap)]
public class MyTypesConfigCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
// Not used but function must be defined
return null;
}
protected override object GetElementKey(ConfigurationElement element)
{
return element;
}
protected override ConfigurationElement CreateNewElement(string elementName)
{
switch (elementName)
{
case "mytype1":
return new MyType1Config();
case "mytype2":
return new MyType2Config();
default:
throw new ConfigurationErrorsException(
string.Format("Unrecognized element '{0}'.", elementName));
}
}
protected override bool IsElementName(string elementName)
{
// Required to be true
return true;
}
public override ConfigurationElementCollectionType CollectionType
{
get { return ConfigurationElementCollectionType.BasicMap; }
}
}
Требуется переопределение CollectionType, даже если это было указано с помощью атрибута в верхней части. Если не переопределить, базовый класс «CollectionType» все еще ссылается на «AddRemoveClearMap», который не будет запускать требуемую функцию «CreateNewElement (string elementName)», но это вариант без параметров «CreateNemElement ()». По той же причине перезаписанная функция IsElementName должна возвращать true.
Обратите внимание, что я создал ElementBaseConfig, который является базовым классом MyType1Config и MyType2Config, в котором вы можете определить некоторые общие атрибуты.